簡體   English   中英

線程問題 - 如果線程池中沒有可用的線程會發生什么?

[英]Threading Question - What happens if no threads available in the thread pool?

我有以下代碼:

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

CancellationToken token = cancelSource.Token;

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

如果沒有線程可用於為新任務的請求提供服務,是否會拋出異常,還是會等待線程可用? 如果要等,要等多久?

來自 MSDN:

您可以對系統 memory 允許的盡可能多的線程池請求進行排隊。 如果請求多於線程池線程,則其他請求保持排隊,直到線程池線程可用。

托管線程池中的線程是后台線程。 也就是說,它們的 IsBackground 屬性為真。 這意味着 ThreadPool 線程不會在所有前台線程都退出后保持應用程序運行。

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

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

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM