Currenly using the following code to wait for a collection of tasks to complete. However, I now have a situation where I want to be able to cancel/abort the WhenAll call, via a cancellation token preferably. How would I go about that?
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)
I'm assuming it's going to but something along the lines of the next bit of code, but I'm not sure what would go in 'XXX'.
Await Tasks.Task.WhenAny(Tasks.Task.WhenAll(TaskCollection), XXX)
You can also await a delay:
Use
TaskCompletionSource<T>
to create a task for some asynchronous condition that does not already have an asynchronous API. UseCancellationToken.Register
to hook the modern CancellationToken-based cancellation system into another cancellation system. Your solution just needs to combine these two.I have a
CancellationToken.AsTask()
extension method in my AsyncEx library, but you can write your own as such:Usage is as you expected:
To cancel, call tcs.SetResult(Nothing). This will fire your Task.WhenAny.
More elegant from my opinion :