gpt4 book ai didi

c# - 如何处理 Task.Run 异常

转载 作者:IT王子 更新时间:2023-10-29 04:09:06 27 4
gpt4 key购买 nike

我在捕获 Task.Run 的异常时遇到了问题,该问题已通过如下更改代码得到解决。我想知道这两种方式处理异常的区别:

Outside 方法中我无法捕获异常,但在 Inside 方法中我可以。

void Outside()
{
try
{
Task.Run(() =>
{
int z = 0;
int x = 1 / z;
});
}
catch (Exception exception)
{
MessageBox.Show("Outside : " + exception.Message);
}
}

void Inside()
{
Task.Run(() =>
{
try
{
int z = 0;
int x = 1 / z;
}
catch (Exception exception)
{
MessageBox.Show("Inside : "+exception.Message);
}
});
}

最佳答案

使用 Task.Wait 的想法可以解决问题,但会导致调用线程(如代码所说)等待并因此阻塞,直到任务完成,这有效地使代码同步而不是异步。

而是使用 Task.ContinueWith 选项来实现结果:

Task.Run(() =>
{
//do some work
}).ContinueWith((t) =>
{
if (t.IsFaulted) throw t.Exception;
if (t.IsCompleted) //optionally do some work);
});

如果任务需要在 UI 线程上继续,请使用 TaskScheduler.FromCurrentSynchronizationContext() 选项作为继续的参数,如下所示:

).ContinueWith((t) =>
{
if (t.IsFaulted) throw t.Exception;
if (t.IsCompleted) //optionally do some work);
}, TaskScheduler.FromCurrentSynchronizationContext());

此代码将简单地从任务级别重新抛出聚合异常。当然,您也可以在这里引入一些其他形式的异常处理。

关于c# - 如何处理 Task.Run 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32067034/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com