所以我有这个任务,从点击按钮开始,我想知道,我如何安全地取消这个任务的循环?
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);
}
}
点击开始任务循环的按钮后,我该如何取消?
答案 0 :(得分:3)
与处理Thread
时不同,如果没有合作,您无法取消/中止Task
。这就是CancellationToken
和CancellationTokenSource
发挥作用的地方。
您应该将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中了解有关该模式的更多信息。