0

它看起来像 MSDN 上用于处理任务中引发的异常的模式同步代码。这是来自MSDN 页面的代码:

var task1 = Task.Factory.StartNew(() =>
{
    throw new MyCustomException("I'm bad, but not too bad!");
});    
try
{
    task1.Wait();
}
catch (AggregateException ae)
{
    // Code removed
}

该调用task1.Wait();导致调用线程阻塞,直到 task1 完成,对吗?如果是这样,那么我根本看不到使用 Task 的理由,因为无论是使用 Task 同步调用还是异步调用代码,调用线程都会阻塞,直到代码完成运行或抛出异常。

另外,如果 task1 在调用代码进入 try-catch 块之前抛出异常会发生什么?如果可能,try-catch 块将不会捕获 AggregateException。

如果我希望调用线程被通知任务中引发的异常,我应该怎么做?我认为我不应该打电话task1.Wait();来收到异常通知。我知道,ContinueWith()但代码也在ContinueWith()一个单独的线程中运行,而不是调用线程。

4

1 回答 1

3

调用 task1.Wait(); 导致调用线程阻塞,直到 task1 完成,对吗?如果是这样,那么我根本看不到使用 Task 的理由,因为无论是使用 Task 同步调用还是异步调用代码,调用线程都会阻塞,直到代码完成运行或抛出异常。

正确的。但是您可以在调用该Wait()方法之前在调用线程上做任何您需要的事情(例如启动其他任务或执行一些操作)。

另外,如果 task1 在调用代码进入 try-catch 块之前抛出异常会发生什么?如果可能,try-catch 块将不会捕获 AggregateException。

异常将被捕获并在内部存储。然后,当您Wait()在任务实例上调用该方法时,原始异常将被包装AggregateException并传播到调用线程。

于 2013-01-23T21:34:03.147 回答