c# - 一次有太多 Delegate.BeginInvoke 调用吗?

标签 c# .net

我正在清理一些旧代码,将其转换为异步工作。

psDelegate.GetStops decStops = psLoadRetrieve.GetLoadStopsByLoadID;
var arStops = decStops.BeginInvoke(loadID, null, null);
WaitHandle.WaitAll(new WaitHandle[] { arStops.AsyncWaitHandle });
var stops = decStops.EndInvoke(arStops);

以上是我为异步工作所做的一个例子。我的计划是让近 20 名不同的代表参加。所有人都将调用 BeginInvoke 并等到它们都完成后再调用 EndInvoke

我的问题是有这么多代表参加会不会造成问题?我知道 BeginInvoke 使用 ThreadPool 来完成工作,并且有 25 个线程的限制。 20 低于该限制,但系统的其他部分很可能也可以使用 ThreadPool 中任意数量的线程。

谢谢!

最佳答案

不,ThreadPool 管理器就是为处理这种情况而设计的。它不会让所有线程池线程同时运行。它开始允许运行与 CPU 内核一样多的线程。一旦一个完成,它就会允许另一个运行。

每隔半秒,如果事件线程未完成,它就会介入。它假定它们被卡住并允许另一个运行。在 2 核 CPU 上,您现在有 3 个线程在运行。

在 2 核 CPU 上达到 500 个线程的最大值需要相当长的时间。您必须拥有 4 分钟以上未完成的线程。如果您的线程以这种方式运行,那么您不想使用线程池线程。

关于c# - 一次有太多 Delegate.BeginInvoke 调用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3029612/

相关文章:

c# - 如何获取Azure存储队列大小/位置

c# - 关闭或处置读卡器时一切都会卡住

c# - 如何在域服务上调用调用操作?

.net - 在 .NET 中编写核心/关键项目有意义吗?

c# - 奇怪的 "name does not exist in current context"错误

c# - 在 C# 中如何覆盖 Finalize() 方法?

c# - 当这种情况发生时如何通知一个人?

c# - Visual Studio 2010 - 无法单步执行 .NET Framework 4 源 (PresentationCore.dll)

c# - 为什么在添加到集合时不为所有对象调用 Equals()

.net - 在 .NET 中读取和解析文件 - Performance For Hire