2012-03-16 110 views
3

.NET任務並行庫如何處理具有阻止操作的任務?在C++ Concrt庫中,您有Context::Oversubscribe方法,但是在.NET庫中沒有找到這樣的東西? LongRunningTask選項是否是處理阻塞任務的相應方式?任務並行庫 - 阻止操作?

.i.e:在C++中,你會怎麼做:

auto my_task_func = [] 
{ 
    //Do work... 
    Context::Oversubscribe(true); 
    // Short or long blocking op. 
    Context::Oversubscribe(false); 
    //Do more work. 

} 

回答

3

的TPL使用爬山算法找到最佳線程數量,而不從任務本身的合作。它只是注入線程,直到任務完成率沒有進一步提高。

+1

'ThreadPool'(TPL在幕後使用)也接收通知,其中一個線程開始阻塞並使用此信息來決定何時創建新線程。 – svick 2012-03-16 12:45:00

+0

svick,好評。我也認爲這是事實,雖然沒有記錄。我似乎無法爲此找到一個參考。 – usr 2012-03-16 13:35:40

+2

我不知道它是否實際上是文檔,但我的源代碼是* CLR,通過C#*,第3版,第759頁:「但是,如果這些線程中的任何一個主動阻止,那麼Windows會通知線程池其中一個線程線程已停止運行。線程池現在創建一個新的線程來替換被阻塞的線程。「 – svick 2012-03-16 14:01:59