我想升级代替Thread with Task的代码。考虑以下示例:
new Thread(()=>{
...
Thread.Sleep(5000);
...
}
介绍任务后:
Task.Run(async ()=> {
...
await Task.Delay(5000);
...
}
然而,这个新的lambda将吞下例外。我想保留异常处理机制。你能提供更好的转型吗?
答案 0 :(得分:2)
该代码将不吞下任何异常。从该lambda中抛出的任何未捕获的异常将导致设置从Task.Run
返回的任务的异常。您可以向该任务添加延续以处理这些异常,或者如果您await
该任务,则异常将在添加的延续中自动重新抛出。
答案 1 :(得分:0)
您应该等待任务:
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