gpt4 book ai didi

.net - 如何取消Task.WhenAll?

转载 作者:行者123 更新时间:2023-12-03 13:28:47 28 4
gpt4 key购买 nike

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com