Dot-Net
如何取消 Task.WhenAll?
目前使用以下程式碼等待任務集合完成。但是,我現在有一種情況,我希望能夠通過取消令牌取消/中止 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())