【发布时间】:2021-05-01 06:46:30
【问题描述】:
我必须执行大约 10 个任务,然后获得它们的结果(都不同)。我创建了一个包装器来捕获异常,我不想知道哪个失败了,但如果失败了,它不应该继续。我也为此使用了WhenAll,但问题是我得到了每个结果的结果并且我得到了一个未处理的异常,如果我的包装器有任何异常,有没有办法不继续?
var 1Task = api.1TaskAsync();
var 2Task = api.2TaskAsync();
var 3Task = api.3TaskAsync();
await taskService.RunSafeAsync(() => Task.WhenAll(1Task, 2Task, 3Task));
var result = await 1Task; <-------------exception
任务服务:
public async Task RunSafeAsync(Func<Task> task)
{
try
{
await task();
}
catch (Exception ex)
{
}
}
【问题讨论】:
-
您是否试图在这些任务中的第一个异常之后中断/取消所有任务?
-
等待 taskService.RunSafeAsync (() => Task.WhenAll (1Task, 2Task, 3Task));如果上面出现任何异常,我不希望它继续 var result = await 1Task 我必须在 RunSafeTask 中返回任何 true 或 false 吗?
-
RunSafeAsync方法对我来说看起来不太安全,因为它会吞下异常!如果这是故意的,那么该方法的更好名称可能是WhenAllNoThrow。在这种情况下,我会质疑这种方法的有用性。您可以直接在调用站点上使用try/catch:try { await Task.WhenAll(Task1, Task2, Task3); } catch { return; }。作为旁注,在 C# 中变量名称以数字开头是非法的。 -
RunSafeAsync sn-p 只是我代码的一部分,它不完整,变量名只是一个例子,以使其更快,我知道它们违反了规则。
标签: c# .net async-await