当前使用以下代码等待任务集合完成。但是,我现在遇到这样一种情况,我希望能够通过取消 token 取消/中止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()
extension method in my AsyncEx library,但是你可以这样写:
<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())
关于.net - 如何取消Task.WhenAll?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27238232/