聚合和转发来自多个线程的异常

本文关键字:线程 异常 转发 | 更新日期: 2023-09-27 18:27:57

在我的方法中,我启动多个线程,然后等待它们完成工作(类似于fork-join模式)。

using (var countdownEvent = new CountdownEvent(runningThreadsCount))
{
    for (int i = 0; i < threadsCount; i++)
    {
        var thread = new Thread(new ThreadStart(delegate
                                                {
                                                   // Do something
                                                   countdownEvent.Signal(); 
                                                }));
        thread.Start();
    }
    countdownEvent.Wait();
}

现在,我需要能够在这个线程中捕获异常(假设// Do something可能会抛出异常),将异常传递给主线程,取消阻止它(因为它正在等待countdownEvent),然后重新抛出异常。

实现这一点最优雅的方法是什么?

聚合和转发来自多个线程的异常

解决了任务API的问题。感谢flq的建议!

var cancellationTokenSource = new CancellationTokenSource();
var tasks = new Task[threadsCount]
for (int i = 0; i < threadsCount; i++)
{
    tasks[i] = Task.Factory.StartNew(
        delegate
            {
                // Do something
            }, cancellationTokenSource.Token);
}
try
{
    Task.WaitAll(tasks);
}
catch (AggregateException ae)
{
    cancellationTokenSource.Cancel();
    throw ae.InnerExceptions[0];
}