目前我有這樣的代碼:
bool task1Result = await RunTask1(data);
if(!task1Result)
return false;
bool task2Result = await RunTask2(data);
if(!task2Result)
return false;
bool task3Result = await RunTask3(data);
if(!task3Result)
return false;
bool task4Result = await RunTask4(data);
if(!task4Result)
return false;
添加示例:
private async Task<bool> RunListOfTasks() {
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken ct = cts.Token;
var tasks = new List<Task<bool>> { RunTask1(data, ct), RunTask2(data, ct), RunTask3(data, ct), RunTask4(data, ct) };
while (tasks.Any())
{
var currentTask = await Task.WhenAny(tasks);
if (!await currentTask)
{
ct.Cancel();
return false;
}
tasks.Remove(currentTask);
}
return true;
}
是否可以并行運行所有這些,如果其中一個失敗(如結果為假),則停止處理其余的并回傳。謝謝
uj5u.com熱心網友回復:
由于其O(n2) 復雜性Task.WhenAny, -in-a-loop通常被認為是一種反模式。首選方法是將您的任務包裝在另一組任務中,這將包括取消當結果為. 然后包裝任務而不是初始任務,并傳播它們的結果。CancellationTokenSourcefalseawait
包裝任務的一種簡單方法是使用SelectLINQ 運算子:
private async Task<bool> RunListOfTasks()
{
using CancellationTokenSource cts = new();
List<Task<bool>> tasks = new()
{
RunTask1(data, cts.Token),
RunTask2(data, cts.Token),
RunTask3(data, cts.Token),
RunTask4(data, cts.Token),
};
Task<bool>[] enhancedTasks = tasks.Select(async task =>
{
try
{
bool result = await task.ConfigureAwait(false);
if (!result) cts.Cancel();
return result;
}
catch (OperationCanceledException) when (cts.IsCancellationRequested)
{
return false;
}
}).ToArray();
bool[] results = await Task.WhenAll(enhancedTasks).ConfigureAwait(false);
return results.All(x => x);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/487066.html
