2011-05-25 24 views
3

我有以下代碼:線程問題 - 如果線程池中沒有線程可用,會發生什麼?

CancellationTokenSource cancelSource = new CancellationTokenSource(); 
_cancelTokenList.Add(cancelSource); 

CancellationToken token = cancelSource.Token; 

Task.Factory.StartNew(() => 
{ 
    StartTest(token); 
}, token); 

將異常拋出,如果沒有可用的線程來服務新任務的要求,否則將只是等待,直到一個線程可用?如果它等待,它會等多久?

+0

蘭迪,這個樣本中的'標記'是什麼? – 2011-05-25 13:24:35

+0

@亨克 - 所以如果需要的話,我可以稍後取消任務。 – 2011-05-25 13:37:20

+0

是的。但是,「可用線程」有什麼意義? – 2011-05-25 13:39:46

回答

4

從MSDN:

系統內存讓您可以排隊儘可能多的線程池的請求。如果有更多的請求比線程池線程多,則額外的請求會保持排隊,直到線程池線程可用。

託管線程池中的線程是後臺線程。也就是說,他們的IsBackground屬性是真實的。這意味着ThreadPool線程在所有前臺線程退出後都不會讓應用程序繼續運行。

它將等待,直到有一個可用,或您的應用程序退出。

2

它只會等到一個線程可用。據我所知,只要獲得線索,它就會等待。如果您在等待某個線程時取消它,它將立即取消,並且用戶代碼將永遠不會運行。

+0

你必須是幸運的盧克..在觸發器上比你自己的影子更快。 – 2011-05-25 13:00:00

+0

這是必須執行通知的任務... – 2011-05-25 13:17:09

+1

如果您在任務開始之前取消任務,任務狀態將從WaitingToRun直接轉到Cancelled並且任務從未開始。 – 2011-05-25 13:19:47

2

將任務交給調度程序。 (默認)TPL調度程序管理少量工作線程並將任務分配給這些線程。如果沒有線程可用,則您的任務將在隊列中等待。如果調度程序排隊的任務太多,則線程池將慢慢創建新的線程(速率爲2 /秒)。

您顯示但不提及CancellationToken。它只能用於請求取消 ,所以我懷疑即使在任務排隊時令牌被取消 也會執行StartTest()。

相關問題