gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:33:34 24 4
gpt4 key购买 nike

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com