我在捕获异常时遇到问题Task.Run
这是通过更改代码解决的,如下所示。我想知道这两种方式处理异常之间的区别:
In the 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());
此代码将简单地从任务级别重新抛出聚合异常。当然,您还可以在这里引入一些其他形式的异常处理。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)