Gul*_*llu 22 c# task pfx task-parallel-library c#-4.0
我有一个按钮,可以产生4个任务.相同的按钮更改为取消按钮,单击此按钮将取消所有4个任务.我是否应该将相同的取消令牌传递给所有4个任务并让他们对IsCancelRequested的相同令牌进行轮询?在createlinkedtokensource上阅读msdn doc后我很困惑.这通常是怎么做的?谢谢
更新:Task.WaitAll()等待所有任务完成执行.类似地,一旦共享取消令牌源设置为取消,如何知道何时取消所有任务.
Mat*_*att 25
是的,你所说的使用单曲CancellationToken
是正确的.您可以创建单个CancellationTokenSource
并将其CancellationToken
用于所有任务.您的任务应定期检查令牌以取消.
例如:
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);
Run Code Online (Sandbox Code Playgroud)
您的按钮可以调用cts.Cancel();
取消任务.
更新问题更新:
有几种方法可以做你所要求的.一种方法是使用ct.IsCancellationRequested
检查取消而不抛弃,然后允许您的任务完成.然后Task.WaitAll(tasks)
在完成所有任务取消后完成.
我已更新代码以反映该更改.