我正在清理一些旧代码,将其转换为异步工作。
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/