如何安全取消任务?

时间:2018-06-04 01:49:01

标签: c# .net asynchronous async-await task

所以我有这个任务,从点击按钮开始,我想知道,我如何安全地取消这个任务的循环?

private async Task RunAsync()
{
    PerformanceCounter counter = new PerformanceCounter("Process", "% Processor Time", pServer.ProcessName, true);
    Random r = new Random();
    while (true)
    {
        float pct = counter.NextValue() / 10f;
        ServerCPU = pct.ToString("0.0");
        await Task.Delay(2000);
    }
}

点击开始任务循环的按钮后,我该如何取消?

1 个答案:

答案 0 :(得分:3)

与处理Thread时不同,如果没有合作,您无法取消/中止Task。这就是CancellationTokenCancellationTokenSource发挥作用的地方。

您应该将CancellationToken传递给RunAsync并检查是否明确请求取消,何时有意义。在你的例子中,我可能会在每次迭代中都这样做:

private async Task RunAsync(CancellationToken ct)
{
    PerformanceCounter counter = new PerformanceCounter("Process", "% Processor Time", pServer.ProcessName, true);
    Random r = new Random();
    while (true)
    {
        ct.ThrowIfCancellationRequested();

        float pct = counter.NextValue() / 10f;
        ServerCPU = pct.ToString("0.0");
        await Task.Delay(2000, ct);
    }
}

在来电者网站上,您应该使用CancellationTokenSource。它将为您提供Token传递给RunAsync以及触发取消的方式:

var cts = new CancellationTokenSource();
RunAsync(cts.Token);

// when you want to cancel it the task:
cts.Cancel();

您可以在Cancellation in Managed Threads中了解有关该模式的更多信息。