当前使用以下代码等待任务集合完成。但是,我现在遇到这样一种情况,我希望能够通过取消 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/

10-14 18:47