就像在讨论线程的时候我们说过,要在线程调用的函数里面做try catch处理,如果在其他线程中使用try catch是无法正常捕获异常。Task也一样,基本原理就是一个线程没办法捕获另一个线程的异常。
static int TaskMethod(string name, int seconds)
{
Console.WriteLine("Task {0} 运行在线程 {1} 上。是否是线程池线程: {2}",
name, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);
throw new Exception("Boom!");
return 42 * seconds;
}
TaskMethod内部并没用try catch 处理,只是抛出一个异常(Boom)。
首先,我们来看一下在主线程中加入Try catch能否正确处理异常:
Task<int> task;
try
{
task = Task.Run(() => TaskMethod("Task 1", 2));
int result = task.Result;
Console.WriteLine("Result: {0}", result);
}
catch