2011-01-11 40 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