2008-08-25 27 views
16

創建的線程有沒有辦法中止與QueueUserWorkItem創建的線程?如何中止與ThreadPool.QueueUserWorkItem

或者,也許我不需要?如果主應用程序退出會發生什麼?所有從它創建的線程都會自動中止嗎?

回答

14

你不需要放棄他們。當你的應用程序退出時,.NET會殺死任何具有IsBackground = true的線程。 .NET線程池將其所有線程設置爲IsBackground = true,因此您不必擔心它。

現在,如果你通過newing了Thread類創建線程,那麼你要麼需要放棄他們或他們的IsBackground屬性設置爲true。

2

是的,他們會的。但是,如果您在這些線程中使用非託管資源,則可能會遇到很多麻煩。

3

線程池使用後臺線程。因此,它們將在應用程序退出時自動關閉。

如果你想自己放棄一個線程,你必須自己管理線程(這樣你可以調用線程對象上的Thread.Abort()),或者你將不得不設置某種形式的通知機制這會讓你告訴線程應該放棄自己。

10

但是,如果你是在那些線程使用非託管 資源,你可以在 很多麻煩結束。

寧願取決於你如何使用他們 - 如果這些非託管資源得到妥善包裹然後他們會與它們的包裝定稿無論用來殺死其中引用了他們的線程機制的處理。 當應用退出時,操作系統釋放非託管資源。

人們普遍認爲(Windows)應用程序花費太多時間嘗試清理應用程序關閉時(通常涉及分頁)大量內存,以致可能會再次丟棄它(或分頁)在代碼中運行釋放操作系統將要處理的未被管理的對象)。

0

是的,他們是背景,但f.ex如果你有,你使用線程池對於一些還挺多的下載和應用程序的東西,你要阻止他們,你怎麼停下來?我的建議是: 退出線程儘快,f.ex

bool stop = false; 
void doDownloadWork(object s) 
{ 
    if (!stop) 
    { 
     DownloadLink((String)s, location); 
    } 
} 

如果設置停止=真,第二個(目前在隊列)的線程自動退出,隊列中的線程完成它的過程之後。

+0

(noet Guenther的回覆) – 2009-06-23 14:26:09

0

據盧卡斯Šalkauskas的回答。

但是,你應該使用:

volatile bool stop = false; 

告訴這個變量用於多個線程的編譯器。

+0

volatile關鍵字是用於更具體的目的,而不僅僅是多線程使用的變量。雖然在這種情況下的使用似乎是合適的,但我不希望任何人過來認爲他們應該爲所有多線程訪問的變量執行此操作。這就像說你永遠不應該使用事務,並且總是在SQL中指定nolock提示時,該語句非常依賴於手頭的解決方案。 – TheXenocide 2010-06-03 22:01:27

相關問題