gpt4 book ai didi

c# - 无需等待的任务异常处理

转载 作者:太空狗 更新时间:2023-10-30 00:04:37 25 4
gpt4 key购买 nike

使用 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/

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