Dot-Net

如何取消 Task.WhenAll?

  • December 1, 2014

目前使用以下程式碼等待任務集合完成。但是,我現在有一種情況,我希望能夠通過取消令牌取消/中止 WhenAll 呼叫。我該怎麼做呢?

 Dim TaskCollection As New List(Of Tasks.Task)
 For x As Integer = 1 To Threads
   Dim NewTask As Tasks.Task = TaskHandler.Delegates(DelegateKey).Invoke(Me, Proxies, TotalParams).ContinueWith(Sub() ThreadFinished())
   TaskCollection.Add(NewTask)
 Next

 Await Tasks.Task.WhenAll(TaskCollection)

我假設它會按照下一段程式碼的方式進行,但我不確定“XXX”會發生什麼。

Await Tasks.Task.WhenAny(Tasks.Task.WhenAll(TaskCollection), XXX)

用於TaskCompletionSource<T>為一些還沒有非同步 API 的非同步條件創建任務。用於CancellationToken.Register將現代的基於 CancellationToken 的取消系統掛鉤到另一個取消系統。您的解決方案只需將這兩者結合起來。

CancellationToken.AsTask()我的AsyncEx 庫中有一個擴展方法,但您可以這樣編寫自己的方法:

<System.Runtime.CompilerServices.Extension> _
Public Shared Function AsTask(cancellationToken As CancellationToken) As Task
 Dim tcs = New TaskCompletionSource(Of Object)()
 cancellationToken.Register(Function() tcs.TrySetCanceled(), useSynchronizationContext := False)
 Return tcs.Task
End Function

用法如您所料:

Await Task.WhenAny(Task.WhenAll(taskCollection), cancellationToken.AsTask())

引用自:https://stackoverflow.com/questions/27238232