2011-01-11 35 views
0


請看以下一段代碼。BeginInvoke:撥打的電話太多

for (int j = 0; j < 500000; j++) 
{ 
    Console.WriteLine(j); 

    // Call BeginInvoke with last two parameters as null 

    IAsyncResult asyncRes = dlg.BeginInvoke(j, 4, ref refString, out outString, progressCallBack, null); 
} 

如果正在調用的方法異步休眠5分鐘。那麼是否正確創建了5個lac線程?

謝謝。

+0

這取決於`dlg`是什麼。 – 2011-01-11 04:24:27

+0

dlg是*公共委託字符串TimeConsumerDelegate(int a,int b,ref string c,out string d)的對象; * – Azodious 2011-01-11 04:29:07

回答

4

這通常是不正確的。當您在委託上調用BeginInvoke時,您正排隊執行異步方法。

.NET Threadpool將根據需要處理的工作項目隊列確定何時以及如何執行您的方法,目標是獲得最大吞吐量,但肯定不會同時運行500000個線程。

當我想你的例子有5分鐘的睡眠,並在代表只有8線程慢慢多開始運行,然後一點點控制檯消息是在流淌。

有關線程池的一個很好的解釋和異步委託閱讀this article