BeginInvoke:拨打了太多电话

时间:2011-01-11 04:22:01

标签: c# delegates 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线程是否正确?

感谢。

1 个答案:

答案 0 :(得分:4)

通常情况并非如此。当您在委托上调用BeginInvoke时,您正在排队异步方法执行。

.NET Threadpool将根据需要处理的工作项队列以及最大吞吐量来决定何时以及如何执行方法,但肯定不会并行运行500000个线程。

当我用5分钟的睡眠尝试你的例子并且代理中只有一个小的控制台消息时,最初只运行了8个线程,然后慢慢地进行了更多的操作。

有关线程池和异步委托的详细说明,请阅读this article