尝试在外部捕获:等待任务.运行(()
本文关键字:等待 任务 运行 外部 | 更新日期: 2023-09-27 18:23:48
try-catch在:await Task.Run(() =>
之外有意义吗?还是只在await内部使用它们?
private async void Test()
{
try
{
await Task.Run(() =>
{
try
{
DoingSomething();
}
catch (Exception ex)
{
log.Error(ex.Message);
}
});
}
catch (Exception ex)
{
log.Error(ex.Message);
}
}
如果在委托内部处理Exception
(在您的情况下只是为了记录目的),await
在正常情况下不会引发异常。这应该没问题。
private async Task Test()
{
await Task.Run(() =>
{
try
{
DoingSomething();
}
catch (Exception ex)
{
log.Error(ex.Message);
}
});
}
然而,由于您是await
而不是Task
,因此很可能在Test
方法中会有一些DoSomethingElse
,这可能会受到Task
结果的影响——在这种情况下,在await
周围设置try/catch
也是有意义的。
private async Task Test()
{
try
{
await Task.Run(() =>
{
try
{
DoingSomething();
}
catch (SomeSpecialException spex)
{
// it is OK to have this exception
log.Error(ex.Message);
}
});
DoSomethingElse(); // does not run when unexpected exception occurs.
}
catch (Exception ex)
{
// Here we are also running on captured SynchronizationContext
// So, can update UI to show error ....
}
}
如果传递给Task.Run
的委托引发异常,则当await
返回任务时,可以在Task.Run
之外捕获它。
你不应该把await
看作是一个块。没有所谓的"等待的内部"。相反,将await
视为一个接受单个参数的运算符(在本例中,是Task.Run
返回的Task
)。CCD_ 18将从其委托捕获异常并将它们放置在返回的CCD_ 19上;CCD_ 20随后将传播该异常。
您也可以将try-catch添加到外部代码中。当异步调用期间发生异常时,编译器将执行catch部分。以下是更多细节,为什么你需要试着四处接球等待http://msdn.microsoft.com/en-us/library/vstudio/0yd65esw.aspx异步方法中的look异常
这是.Net 6:中的行为
try{
await Task.Run(()=> & call whatever method );
}
catch { handle the exception } <-- the catch will never get hit. An unhandled exception in the Task.Run line will happen
然而,这将起作用:
try{
await Task.Run(async ()=> & call some method );
}
catch(Exception ex){
handle the exception
}
()=>必须在那里等待.Net 6
我刚刚证实了这一点。