Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在任务中处理lambda表达式中的异常?_C#_Exception Handling_Task_Lambda_C# 5.0 - Fatal编程技术网

C# 如何在任务中处理lambda表达式中的异常?

C# 如何在任务中处理lambda表达式中的异常?,c#,exception-handling,task,lambda,c#-5.0,C#,Exception Handling,Task,Lambda,C# 5.0,我试图将应用程序转换为使用任务而不是Microsoft的多线程框架,但在错误处理方面遇到了问题。根据Microsoft的文档(),我希望下面的try catch能够捕获异常: private async void Button1_Click() { try { object obj = await TaskFunctionAsync() } catch(Exception ex) {} } public Task<object>

我试图将应用程序转换为使用任务而不是Microsoft的多线程框架,但在错误处理方面遇到了问题。根据Microsoft的文档(),我希望下面的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();
    });
}
private async void按钮1\u Click()
{
尝试
{
object obj=await taskfunctionsync()
}
捕获(例外情况除外)
{}
}
公共任务TaskFunctionSync()
{
返回任务。运行(()=>
{
抛出新异常(“foo”);
返回新对象();
});
}
但是当Button1\u Click被激发时,我在lambda表达式中得到一个未处理的异常。是否有某种方法可以将异常导出到try-catch中?我认为这种错误处理(因此不需要从任务工作线程封送)是任务框架的主要优点之一

我也试过:

public async Task<object> TaskFunctionAsync()
{
    return await Task.Run<object>(() =>
        {
            throw new Exception("foo");
            return new object();
        });
}
public异步任务TaskFunctionAsync()
{
返回等待任务。运行(()=>
{
抛出新异常(“foo”);
返回新对象();
});
}
但是当Button1\u Click被触发时,我在 lambda表达式


那不是真的。它未被用户代码处理,因为框架捕获了它,但不是完全未处理。继续运行应用程序,以查看Button1\u Click中的catch将捕获异常。

是否有任何方法使其不在lambda表达式中抛出(但仍在Button1\u Click中),或者有某种方法更“正确”地处理它?这是正确的方法。可能您的调试器设置为在所有异常上都中断(这通常是一件好事)。按Ctrl-alt-E。