В отличие от Thread
s, вы не можете отменить / отменить 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();
Подробнее об этом шаблоне можно прочитать в Отмена в управляемых потоках .