我想升级我的代码,用任务替换线程。考虑下面的例子:
new Thread(()=>{
...
Thread.Sleep(5000);
...
}
引入Task后:
Task.Run(async ()=> {
...
await Task.Delay(5000);
...
}
但是,这个新的 lambda 会吞下异常。我想保留异常处理机制。你能提供更好的转换吗?
我想升级我的代码,用任务替换线程。考虑下面的例子:
new Thread(()=>{
...
Thread.Sleep(5000);
...
}
引入Task后:
Task.Run(async ()=> {
...
await Task.Delay(5000);
...
}
但是,这个新的 lambda 会吞下异常。我想保留异常处理机制。你能提供更好的转换吗?
该代码不会吞下任何异常。从该 lambda 中抛出的任何未捕获的异常都将导致设置从Task.Run
. 您可以向该任务添加延续以处理这些异常,或者如果您await
是该任务,那么异常将在添加的延续中自动重新抛出。
您应该等待任务:
try
{
await Task.Run(async () =>
{
await Task.Delay(5000);
throw new Exception("Test1");
});
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
或者使用仅在任务抛出异常时触发的延续任务,并让延续任务处理该异常:
Task.Run(async () =>
{
await Task.Delay(5000);
throw new Exception("Test1");
}).ContinueWith(task =>
{
foreach (var ex in task.Exception.Flatten().InnerExceptions)
{
Debug.WriteLine(ex.Message);
}
}, TaskContinuationOptions.OnlyOnFaulted);
编辑 更新了处理任务抛出的异常的正确方法。
http://msdn.microsoft.com/en-us/library/dd997415(v=vs.110).aspx