gpt4 book ai didi

c# - ManualResetEvent 不等待线程池完成

转载 作者:行者123 更新时间:2023-11-30 16:55:27 25 4
gpt4 key购买 nike

我有要处理的批处理列表。永远。
我想并行处理每个 block (5),完成后移动到下一个 block 。
出于某种原因,下面的代码不会等待 block 完成并继续,即使它没有完成。

while (true)
{
foreach (string[] urlsArr in chunks)
{
int i = 0;
foreach (var url in urlsArr)
{
ThreadPool.QueueUserWorkItem(x =>
{
ProccessUrl(url, config, drivers[i]);
_resetEvent.Set();
i++;
});
}
_resetEvent.WaitOne();// this is not really waiting.
}
}

最佳答案

这是一个带有 Tasks(async/await) 的版本

while (true)
{
foreach (string[] urlsArr in chunks)
{
Task[] tasks = new Task[urlsArr.Length];
for (int i = 0; i < urlsArr.Length; i++)
{
var url = urlsArr[i];
var driver = drivers[i];
tasks[i] = Task.Run(() => { ProccessUrl(url, config, driver); });
}

await Task.WhenAll(tasks);
}
}

请注意,它还修复了原始代码中的“i”变量未以线程安全方式递增的问题(可以使用 Interlocked.Increment 修复)。

如果您的代码不是async,您可以等待线程中的任务完成(但这是阻塞的)

Task.WhenAll(tasks).Wait();

关于c# - ManualResetEvent 不等待线程池完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29468688/

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