I have a button thats spawns 4 tasks. The same button changes to a cancel button and clicking this should cancel all 4 tasks. Should I pass the same cancel token to all 4 tasks and have them poll on the same token for IsCancelRequested ? I am confused after reading the msdn doc on createlinkedtokensource. How is this normally done ? thank you
Update: Task.WaitAll() waits tills all tasks complete execution. Similarly how to know when all tasks have been canceled once the shared cancel token source is set to cancel.
Yeah, what you said about using a single CancellationToken
is correct. You can create a single CancellationTokenSource
and use its CancellationToken
for all of the tasks. Your tasks should check the token regularly for cancellation.
For example:
const int NUM_TASKS = 4;
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken ct = cts.Token;
Task[] tasks = new Task[NUM_TASKS];
for (int i = 0; i < NUM_TASKS; i++)
{
tasks[i] = Task.Factory.StartNew(() =>
{
while (true)
{
Thread.Sleep(1000);
if (ct.IsCancellationRequested)
break;
}
}, ct);
}
Task.WaitAll(tasks);
Your button can call cts.Cancel();
to cancel the tasks.
Update for question update:
There are a few ways to do what you ask. One way is to use ct.IsCancellationRequested
to check cancellation without throwing, then allow your task to complete. Then Task.WaitAll(tasks)
will complete when all of the tasks have been cancelled.
I've updated the code to reflect that change.