Unity3d 與 C#線程的坑處?

使用C# 寫 unity腳本時為什麼不能用 thread.Abort(); 結束線程?

例如偽代碼:

Thread t;
void Start()
{
t = new Thread(run);
t.start();
}
void run()
{
while(true) debug.log("run");
}

void OnApplicationQuit()
{
t.Abort();
}

在unity編輯器里取消play 後, 仍然在不斷列印 run?


unity3d我不知道,至少在net4.0裡面,Thread.Abort已經是obsolete的了,再也不能用了。

而且這樣做其實不好。所有的線程都應該通過互相交換信號最後優雅的退出,這樣才是好的編程習慣。


搞過windows 開發的都應該知道,隨便terminate任何一個線程和進程都是不好的行為,我是大v粉╮(╯▽╰)╭。簡單點的可以建立一個變數可以使用近似輪詢的方式檢查線程是否應該停止運行。


System.Environment.Exit(0)


請不要在UNITY里使用任何的Thread!Unity用的Mono也不等於.Net,是兩套框架。

Unity提供了Coroutine和yield來處理這種情況。

Unity - Scripting API: MonoBehaviour.StartCoroutine

Unity - Scripting API: MonoBehaviour.StopCoroutine


Thread.Abort 並沒有 obsolete

為什麼不能 abort,不是不能,是不好,可能出現嚴重的問題。

舉例:

Monitor.Enter(obj);
// 這中間拋個exception
Monitor.Exit(obj)

Thread 結束了,但是被鎖的資源沒有被釋放。

—————————————————————

SemaphoreSlim , ManualResetEventSlim 等 釋放信號結束線程比較優雅。

有些時候記得用 .Join()

Blocks the calling thread until the thread represented by this instance terminates

這個資源很好建議看看 Threading in C# - Free E-book


如果題主一定要用 Abort ( ) 結束線程,在 while 循環中加句 Thread.Sleep( int milliseconds ) ; 就可以了。


suspend()也obsolete了,不知道如何掛起了


兄弟, 寫在OnDestroy里試試吧。


我也想知道!就像一對朋友結婚了 可以相輔相成 但終究不是最適合的 java才是最適合的吧

我也不知道我在說啥


推薦閱讀:

為什麼覺得用VIM寫代碼比用GUI界面的編輯器更累?
適合 Mac 學習「大學C++」的軟體應該用什麼?
C#軟體如何良好的防止反編譯被破解?
為什麼說非同步編程是反人類?

TAG:編程 | Unity遊戲引擎 | C# | 多線程 |