pix*_*xel 4 c# exception-handling task
使用"任务"时,我不确定如何在不调用"等待"任务时如何处理.以下示例不在async方法中执行.
这是一个例子:
var t = Task.Run(() =>
{
// do something as part of the task concurrently
});
Run Code Online (Sandbox Code Playgroud)
将上面的整个块包装起来并捕获异常是正确的方法吗?
我知道我可以等待下面的任务结果并处理异常,但我的问题与上面的块有关而没有调用t.Wait.
try
{
t.Wait();
}
catch(AggregateException ae)
{
// handle exception(s)
}
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是,当我不等待(或等待)任务时,这是否是处理异常的正确方法?
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
}
Run Code Online (Sandbox Code Playgroud)
UPDATE1 ,或者我应该这样做?
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
}
});
Run Code Online (Sandbox Code Playgroud)
Avn*_*tan 11
你(编辑后)提供的代码不会帮助你在处理引发的错误里你的任务.它只会捕获主代码块中抛出的异常,例如在调度任务或获取传递给它的参数时.
如果您使用的是C#5及更高版本(与VS2013捆绑在一起),最简单的方法是使用async/await,这简化了异步任务的控制流程:
public async Task DoSomething()
{
try
{
DoSyncWork();
await Task.Run(() => AsyncStuff());
}
catch (Exception ex)
{
// handle.
}
}
Run Code Online (Sandbox Code Playgroud)
编译器将自动解构异步任务并将异常返回到正常catch块 - 无论代码的同步或异步部分是否引发异常.
如果你不使用C#5,或不喜欢使用异步/等待(因为你正在处理的并行性,不只是异步),该技术是用Task.ContinueWith在错误的情况下,以指定的延续:
var task = Task.Run(() => Whatever())
.ContinueWith(failedTask => HandleError(failedTask),
TaskContinuationOptions.OnlyOnFaulted);
Run Code Online (Sandbox Code Playgroud)
这将导致在原始任务完成后继续启动,但仅在它引发异常时才会启动.您可以使用它根据结果指定多个延续分支:
var baseTask = Task.Run(() => Whatever());
baseTask.ContinueWith(failedTask => HandleError(failedTask),
TaskContinuationOptions.OnlyOnFaulted);
baseTask.ContinueWith(successfulTask => HandleResults(successfulTask),
TaskContinuationOptions.OnlyOnRanToCompletion);
Run Code Online (Sandbox Code Playgroud)