簡體   English   中英

如何從 Task.WhenAll 執行返回未取消的任務

[英]How to return the not-cancelled tasks from Task.WhenAll execution

我有一個可取消的任務列表; 他們有他們的CancellationTokenSource 他們的取消獨立於其他人。 我想從Task.WhenAll返回所有未取消的任務。

var tasks = new List<Task<string>>();

/** some code here **/

var done = await Task.WhenAll(tasks); // This throws an OperationCanceledException,
                                      // when at least one task is cancelled.

StackOverflow 中有“如何取消任務內的任務”的問題,但這里的問題並非如此。

您可以通過循環Task.WhenAll重試其余的任務

var tasks = new List<Task<string>>();

/** some code here **/
var notCanceled = tasks;
do
{
    try
    {
        await Task.WhenAll(notCanceled);
        break;
    }
    catch (OperationCanceledException)
    {
        notCanceled = notCanceled.Where(t => !t.IsCanceled).ToArray();
    }
} while (notCanceled.Any())

一種方法是將Task.WhenAll任務存儲在Task變量中,以便您可以添加專門處理IsCanceled情況的catch塊。

var tasks = new List<Task<string>>();

/** some code here **/

Task whenAll = Task.WhenAll(tasks);
Task<string>[] successfullyCompletedTasks;

try
{
    await whenAll;
    successfullyCompletedTasks = tasks.ToArray();
}
catch when (whenAll.IsCanceled)
{
    successfullyCompletedTasks = tasks.Where(t => !t.IsCanceled).ToArray();
}

// Make sure that our assumptions do not contradict the reality
Debug.Assert(successfullyCompletedTasks.All(t => t.IsCompletedSuccessfully));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM