gpt4 book ai didi

c# - ThreadPool.QueueUserWorkItem 中的最大排队元素

转载 作者:太空狗 更新时间:2023-10-29 18:04:20 25 4
gpt4 key购买 nike

我将最大线程设置为 10。然后我使用 ThreadPool.QueueUserWorkItem 添加了 22000 个任务。很可能运行程序后22000的任务并没有全部完成。有多少任务可以排队等待可用线程有限制吗?

最佳答案

如果您需要等待所有任务处理完毕,您需要自己处理。 ThreadPool 线程都是后台线程,不会让应用程序保持事件状态。

这是处理此类情况的一种相对干净的方法:

 using (var mre = new ManualResetEvent(false))
{
int remainingToProcess = workItems.Count(); // Assuming workItems is a collection of "tasks"
foreach(var item in workItems)
{
// Delegate closure (in C# 4 and earlier) below will
// capture a reference to 'item', resulting in
// the incorrect item sent to ProcessTask each iteration. Use a local copy
// of the 'item' variable instead.
// C# 5/VS2012 will not require the local here.
var localItem = item;
ThreadPool.QueueUserWorkItem(delegate
{
// Replace this with your "work"
ProcessTask(localItem);

// This will (safely) decrement the remaining count, and allow the main thread to continue when we're done
if (Interlocked.Decrement(ref remainingToProcess) == 0)
mre.Set();
});
}
mre.WaitOne();
}

也就是说,如果您有数千个工作项,最好将它们“组合”在一起,而不是将它们视为线程池的单独工作项。这是管理项目列表所涉及的一些开销,并且由于您无法一次处理 22000 个,因此最好将它们分组到 block 中。每个进程有 50 个左右的单一工作项目可能会对您的整体吞吐量有很大帮助......

关于c# - ThreadPool.QueueUserWorkItem 中的最大排队元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2095805/

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