将我的线程代码转换为Task

时间:2013-11-08 22:55:17

标签: c# multithreading task-parallel-library

我想升级代替Thread with Task的代码。考虑以下示例:

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

介绍任务后:

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

然而,这个新的lambda将吞下例外。我想保留异常处理机制。你能提供更好的转型吗?

2 个答案:

答案 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