igu*_*man 18 .net vb.net task-parallel-library
Currenly使用以下代码等待完成任务的集合.但是,我现在有一种情况,我希望能够通过取消令牌取消/中止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)
Run Code Online (Sandbox Code Playgroud)
我假设它会接下来的代码,但是我不确定'XXX'中会出现什么.
Await Tasks.Task.WhenAny(Tasks.Task.WhenAll(TaskCollection), XXX)
Run Code Online (Sandbox Code Playgroud)
Ste*_*ary 20
使用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
Run Code Online (Sandbox Code Playgroud)
用法如您所愿:
Await Task.WhenAny(Task.WhenAll(taskCollection), cancellationToken.AsTask())
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7034 次 |
| 最近记录: |