0

我想升级我的代码,用任务替换线程。考虑下面的例子:

new Thread(()=>{
  ...
  Thread.Sleep(5000);
  ...
}

引入Task后:

Task.Run(async ()=> {
  ...
  await Task.Delay(5000);
  ...
 }

但是,这个新的 lambda 会吞下异常。我想保留异常处理机制。你能提供更好的转换吗?

4

2 回答 2

2

该代码不会吞下任何异常。从该 lambda 中抛出的任何未捕获的异常都将导致设置从Task.Run. 您可以向该任务添加延续以处理这些异常,或者如果您await是该任务,那么异常将在添加的延续中自动重新抛出。

于 2013-11-08T23:25:38.090 回答
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

于 2013-11-08T23:28:24.093 回答