使用 Tasks 时,如果我没有在我的任务上调用 Wait,我不确定如何处理。以下示例未在异步方法中执行。
这是一个例子:
var t = Task.Run(() =>
{
// do something as part of the task concurrently
});
包裹上面的整个 block 并捕获异常是正确的方法吗?
我知道我可以像下面这样等待任务结果并处理异常,但我的问题与上面的 block 有关,而无需调用 t.Wait。
try
{
t.Wait();
}
catch(AggregateException ae)
{
// handle exception(s)
}
所以,我的问题是当我不等待(或等待)任务时,这是否是处理异常的正确方法?
try
{
var t = Task.Run(() =>
{
// do something as part of the task concurrently
});
}
catch(Exception ex) //NOTE general Exception
{
// show exception in message box or log it somewhere
}
更新1 ,或者我应该这样做吗?
var t = Task.Run(
() =>
{
try
{
// do something as part of the task concurrently
}
catch(Exception ex) //NOTE general Exception
{
// show exception in message box or log it somewhere
}
});
最佳答案
您提供的代码(在编辑之后)不会帮助您处理在您的任务中抛出的错误。它只会捕获主代码块中抛出的异常,例如在调度任务或获取要传递给它的参数时。
Async/Await 简化异步任务控制流程
如果您使用的是 C# 5 及更高版本(与 VS2013 捆绑在一起),最简单的方法是使用 async/await
,它可以简化异步任务的控制流:
public async Task DoSomething()
{
try
{
DoSyncWork();
await Task.Run(() => AsyncStuff());
}
catch (Exception ex)
{
// handle.
}
}
编译器将自动解构异步任务并将异常返回到正常的 catch
block - 无论代码的同步部分还是异步部分是否抛出异常。
OnlyOnFaulted 继续处理任务异常
如果您不使用 C# 5,或者不想使用 async/await(因为您处理的是并行性,而不仅仅是异步),技术是使用 Task.ContinueWith
来指定错误情况下的继续:
var task = Task.Run(() => Whatever())
.ContinueWith(failedTask => HandleError(failedTask),
TaskContinuationOptions.OnlyOnFaulted);
这将导致继续在原始任务完成后启动,但前提是它抛出异常。您可以使用它根据结果指定多个延续分支:
var baseTask = Task.Run(() => Whatever());
baseTask.ContinueWith(failedTask => HandleError(failedTask),
TaskContinuationOptions.OnlyOnFaulted);
baseTask.ContinueWith(successfulTask => HandleResults(successfulTask),
TaskContinuationOptions.OnlyOnRanToCompletion);
关于c# - 无需等待的任务异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38210880/