Как мне безопасно отменить задание? - PullRequest
0 голосов
/ 04 июня 2018

Итак, у меня есть эта задача, которая запускается одним нажатием кнопки, и мне было интересно, как я могу безопасно отменить цикл этой задачи?

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 голосов
/ 04 июня 2018

В отличие от 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();

Подробнее об этом шаблоне можно прочитать в Отмена в управляемых потоках .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...