在我的方法中,我启动多个线程,然后等到他们完成工作(类似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
并重新抛出异常。
实现这一目标最优雅的方式是什么?
答案 0 :(得分:1)
用Tasks 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];
}