簡體   English   中英

有沒有一種方法可以觸發2個任務,等待一個任務完成(不取消另一個任務),然后設置一個返回結果的時間

[英]Is there a way to trigger 2 tasks, await for one to complete (without cancelling the other task) and then set a time before returning result

我正在現有的應用程序中實現一項新功能,並且想知道如何才能最好地實現以下目標:

  1. 創建兩個任務。
  2. 並行啟動它們。
  3. 等待並等待其中之一完成。
  4. 一旦其中一個完成,請在返回響應之前旋轉計時器t秒鍾。 這樣做是因為一個任務可能比另一個任務運行更長的時間。

我有#1至#3但#4的解決方案。

List<Task> tasks = new List<Task>(length);
tasks.Add(CreateTask(get_data_source));
await Task.WhenAny(tasks);

我不想在#3中提供任何超時。 但我想等到任務完成后再觸發計時器t秒鍾。 t秒后,返回結果(如果兩個都完成,則其他兩個都只是完成的任務)。

在第一個任務完成后,您可以等待任何剩余任務或延遲任務完成。

這將使您有可能等待5秒鍾,其他任務才能完成,否則請返回結果。

var tasks = new List<Task>
{
    CreateTask(get_data_source),
    CreateTask(get_data_source2)
};

var completedTask = await Task.WhenAny(tasks);

await Task.WhenAny(Task.WhenAll(tasks), Task.Delay(5000));

// Return result

對於Task.WhenAll(),這可能是個好地方。 當所有任務完成時,它將返回。 這樣,您可以等待所有任務響應,而不必等待一段時間。

https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.task.whenall?view=netframework-4.8

另一個示例,使用CancellationTokenCancellationTokenSource.CancelAfter

var ts = new CancellationTokenSource();

var list = Enumerable.Range(0, 4)
                     .Select(x => DoStuff(ts.Token))
                     .ToList();

await Task.WhenAny(list);

ts.CancelAfter(1000);

await Task.WhenAll(list);

這將有助於如果你的任務是使用CancellationTokens幫助關閉它們勇退

暫無
暫無

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

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