gpt4 book ai didi

c# - 是否有等效于 Java CompletionService 的 C# 来响应已完成的线程?

转载 作者:太空宇宙 更新时间:2023-11-03 19:10:20 27 4
gpt4 key购买 nike

有很多关于如何等待所有“worker”作业完成的示例,但是如何在每个 worker 完成时以与 Java 的 CompletionService 相同的方式使用react呢?

我已经破解了一些有用的东西,但这看起来很脆弱:

int completedWorkers = 0;
while (completedWorkers < workerCount)
{
int eventId = WaitHandle.WaitAny(eventArray);
events[eventId].Reset();
completedWorkers++;
Console.WriteLine("Worker {0} has completed. {1} have now completed.", eventId, completedWorkers);
}
Console.WriteLine("All threads have finished");

这依赖于一组 ManualResetEvent 实例(在我的示例中为“eventArray”),类似于 Microsoft 示例 http://msdn.microsoft.com/en-us/library/3dasc8as.aspx 中所示的数组(但是他们的代码使用 WaitAll() 来等待所有工作人员完成,而不是在每个工作人员完成时使用react)。

编辑:

我已经使用 TPL 接受了 Douglas 的回答,但作为引用,Delegates 为我们提供了这个开箱即用的功能:

IAsyncResult result = caller.BeginInvoke(
new AsyncCallback(CallbackMethod),
"The call executed on thread {0}, with return value \"{1}\".");

...

void CallbackMethod(IAsyncResult ar)
{
// 'react' to async delegates completing
}

最佳答案

如果您使用任务并行库,您可以为每个任务附加一个延续。

int completedWorkers = 0;
var continuations = tasks.Select((task, index) => task.ContinueWith(antecedent =>
{
lock (tasks) // only required if you want to avoid races between incrementing and writing
{
int _index = index; // avoid closures issue
completedWorkers++; // if lock is removed, replace with: Interlocked.Increment(ref completedWorkers);
Console.WriteLine("Worker {0} has completed. {1} have now completed.", _index, completedWorkers);
}
}));
Task.WaitAll(continuations.ToArray());
Console.WriteLine("All threads have finished");

关于c# - 是否有等效于 Java CompletionService 的 C# 来响应已完成的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21187203/

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