有一个任务列表(调用相同的方法),它是这样的:
//цикл, содержащий код:
async Task<Result> function() await _pushData(data, cToken);
_taskList.Add(Task.Run(function, cToken));
循环后:
await Task.WhenAll(_taskList);
_pushData
里面包含很多子任务,几乎每个子任务都cToken.ThrowIfCancellationRequested();
在启动时调用。一些(大) - 几次,在每个复杂的操作之前。任务本身处理不同数量的数据。
调用此循环的代码包含以下内容:
var cts = new CancellationTokenSource();
try
{
await PushDataThere(data, cts.Token).ConfigureAwait(false);
_log.Info("Успешно.");
}
catch (PushCancelledException ex)
{
cts.Cancel();
_log.Fatal("Остановка задач.");
throw;
}
在这里,我发现了一个异常,如果有的话-我一次取消所有任务。
问题的本质是我在方法中编写了一个异常的测试抛出_pushData
,并且在所有 44 个全局任务中,它总是throw new Exception("Test");
在调用之前被调用cts.Cancel();
。那些。我需要在所有任务完成之前抛出异常(如果有的话) 。
有什么办法可以解决这个问题吗?
从链接中找到答案。
那些。需要调用所有并行(顶级)任务
ContinueWith(task => cts.Cancel(), cts.Token, TaskContinuationOptions.OnlyOnFaulted, TaskScheduler.Default);
。然后,如果任务中出现异常,将调用回调task => cts.Cancel()
,并在控制返回之前取消WhenAll(tasks)
。在我的代码中,我必须
_pushData
传入 notCancellationToken
aCancellationTokenSource
。