Задача.Метод Ожидания (CancellationToken)


Может кто-нибудь, пожалуйста, объяснить мне использование задачи.Ждать (CancellationToken) перегрузки? MSDN действительно много говорит об этом...

Вот как я обычно справляюсь с отменой заданий:

        var source = new CancellationTokenSource();
        var task = Task.Factory.StartNew(() => 
        {
            while (true)
            {
                source.Token.ThrowIfCancellationRequested();
            }
        }, source.Token);

        try
        {
            task.Wait();
        }
        catch (AggregateException exc)
        {
            exc.Flatten().Handle(e => e is OperationCanceledException);
        }

Итак, когда полезно передать маркер методу Wait?

2 6

2 ответа:

Рассмотрим случай, когда вы хотите отменитьожидание задачи, фактически не отменяя саму задачу... либо потому, что задача сама по себе не справляется с отменой, либо потому, что вы действительно хотите продолжать работу с задачей, но (скажем) отвечаете пользователю: "это займет некоторое время... но это все еще продолжается. Это безопасно, чтобы закрыть ваш браузер."(Или что там еще.)

Нашел это в Белой книге Microsoft:

Также интересно отметить существование перегрузки для задачи.Wait (), который принимает CancellationToken с задачей подписи.Подождите (CancellationToken). Эта перегрузка принимает маркер, так что ожидание может быть отменено; эта перегрузка не имеет ничего общего с отменой задачи, но скорее может привести к преждевременному возвращению ожидания. Если Задача.Используется Wait (ct), и ожидание прерывается, потому что он обнаруживает, что маркер был сигнализирован, затем будет вызвано исключение OperationCanceledException(ct), указывающее, что операция ожидания была отменена.