如何在Task中的lambda表达式中处理异常?

时间:2012-11-27 21:05:53

标签: c# exception-handling task lambda c#-5.0

我正在尝试将应用程序转换为使用Tasks而不是Microsoft的多线程框架,但我遇到了错误处理问题。从Microsoft的文档(http://msdn.microsoft.com/en-us/library/vstudio/0yd65esw.aspx),我希望下面的try-catch能够捕获异常:

private async void Button1_Click()
{
    try
    {
        object obj = await TaskFunctionAsync()
    }
    catch(Exception ex)
    {}
}

public Task<object> TaskFunctionAsync()
{
    return Task.Run<object>(() =>
    {
        throw new Exception("foo");
        return new object();
    });
}

但是当Button1_Click被触发时,我在lambda表达式中得到一个未处理的异常。有没有办法让异常进入try-catch?我认为这种错误处理(所以你不需要从任务工作者线程编组)是任务框架的主要好处之一。

我也试过了:

public async Task<object> TaskFunctionAsync()
{
    return await Task.Run<object>(() =>
        {
            throw new Exception("foo");
            return new object();
        });
}

1 个答案:

答案 0 :(得分:2)

  

但是当Button1_Click被触发时,我得到一个未处理的异常   lambda表达式

那不是真的。它由用户代码未处理,因为框架捕获了它,但未完全未处理。继续运行应用程序,看看Button1_Click中的catch会捕获异常。