2011-09-14 43 views
2

我創建了一個新線程併爲其分配了一個使用ThreadStart執行的函數。 下面一個例子:線程在其ThreadStart例程返回時是否自動停止?

this.threadAppPtE = new Thread(new ThreadStart(synchronizeAppPte)); 

自動執行線程暫停時功能給我分配末端或者我不得不手動結束了嗎?

回答

2

http://msdn.microsoft.com/en-us/library/ms686724(v=vs.85).aspx

線程執行,直到以下事件之一發生:

  • 的線程調用ExitThread函數。
  • 進程的任何線程調用ExitProcess函數。
  • 線程函數返回。
  • 任何線程都會調用帶有線程句柄的TerminateThread函數。
  • 任何線程都會調用TerminateProcess函數和進程的句柄。
+0

在.NET中,'Thread'不與操作系統線程一一映射,因此您的項目符號列表並不是100%代表線程在.NET應用程序中的結果。另外,大多數.NET開發人員使用BCL而不是Win32 API調用。不要誤會我的意思,儘管它沒有任何.NET上下文,但這篇文章很有用。 –

+0

@Brian - 您可能會注意到粗體的部分。雖然託管線程可能無法與本地線程完全相同(即.NET使用OS線程運行託管線程,但託管線程可能無法在整個持續時間內在同一個OS線程中運行),但我強調的部分以及哪個部分很重要對於Luke來說:線程在線程函數返回時結束。作爲一個方面說明:我從來沒有進行任何以.NET進程爲目標的跨進程通信(因此需要使用本機WinAPI調用) - 這聽起來像一個有趣的項目。所以,謝謝。 –

+0

是的,我注意到這部分是粗體。我並不是說你的答案有任何不正確的地方。我建議如果項目符號列表對.NET有強調,它會更有用*。從這個角度來看,這是一個很好的角度,但如果提到導致線程結束的特定於.NET的機制會更好。 –

2

是的,線程會自動終止,只要它沒有被阻塞,並完成它的工作。顯然你需要撥打threadAppPtE.Start()首先啓動它。

要重新加入未完成的線程會更復雜。有一篇很好的文章叫做Create and Terminate Threads,這可能有助於更好地解釋這個過程。