2011-10-07 95 views

回答

13
  • 如果您已經很好地設計了線程,您應該有一種機制來關閉它們 - 例如,使用ManualResetEvent信號他們關閉
  • 可以的Thread.join等待,直到他們關閉,或Thread.Abort的,讓他們在一個討厭的方式
  • 如果他們是後臺線程,他們將在應用程序不會中止關閉

參見:http://msdn.microsoft.com/en-us/library/7a2f3ay4(v=vs.80).aspx

+0

我會添加標準評論 - 永遠不要使用中止(在S/O上進行搜索以查看所有細節,爲什麼這是一個非常糟糕的主意)。 –

+1

請仔細閱讀爲什麼,因爲在大多數情況下,這是一個完全可以接受的折中方案。 「永遠不要放棄」是錯誤的,我害怕。 –

+2

公平點。除非你明白反對的觀點,否則你不要這樣做。 –

0

收集它們的地方,比如

static public List<Thread> AllThreads; 

,並使用該集合.Abort()他們,一個接一個。

這是錯誤的方式。更好的辦法是讓他們以某種方式停下來,然後一個接着一個地點。

+0

你的意思是'.abort()'? '.Terminate'不存在 –

+0

另外,如果你有一個列表,爲什麼不'AllThreads.ForEach(t => t.Abort());'? –

+0

@KierenJohnstone當我說他們一個接一個終止他時,那正是我的意思。 Lambda,不然,你是一個接一個地終止它們的。 –

17

您可以設置 「的IsBackground」 屬性設置爲true。當應用程序退出時,CLR會關閉所有後臺線程。

-2

通過讓程序真正關閉,即。不要故意引入任何強制運行主窗口的線程等待其他線程的代碼。運行主窗口的線程然後可以自由地退出Process(),然後操作系統將終止進程中的所有其他線程,無論他們在做什麼。

RGDS, 馬丁

+0

默認情況下在.NET上,不是後臺的線程將意味着應用程序不會簡單地「關閉」。如果你打電話給ExitProcess(在.NET世界中叫做Environment.Exit),那就可以工作了 –

+0

糟糕 - 誤讀了'C#'標籤:((在做C++的時候.. –

0

設置IsBackground屬性爲true,並添加以下行:

AppDomain.CurrentDomain.ProcessExit += CloseMe; // for the main process 
AppDomain.CurrentDomain.DomainUnload += CloseMe; // for ApplicationDomains 

CloseMe方法設置這是在線程的主循環檢查的標誌。

6

嘗試

Application.ExitThread(); 
Environment.Exit(0); 

Dispatcher.CurrentDispatcher.Thread.Abort();