当前正在使用下面的代码等待任务集合完成。然而,我现在有一种情况,我希望能够取消/中止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)
4条答案
按热度按时间c3frrgcw1#
使用
TaskCompletionSource<T>
为某些尚未具有异步API的异步条件创建任务。使用CancellationToken.Register
将基于CancellationToken的现代取消系统连接到另一个取消系统。您的解决方案只需要将这两者合并结合起来。我有一个
CancellationToken.AsTask()
extension method in my AsyncEx library,但你可以这样写你自己的:用法如您所料:
bvpmtnay2#
若要取消,请调用tcs.SetResult(Nothing)。这将触发您的Task.WhenAny.
q35jwt9p3#
在我看来更优雅:
bq9c1y664#
在.NET 6(或更高版本)中,您现在可以使用:用途:
WaitAsync可以接受
TimeSpan timeout
、CancellationToken
或两者。