Задача.Метод Ожидания (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 ответа:
Рассмотрим случай, когда вы хотите отменитьожидание задачи, фактически не отменяя саму задачу... либо потому, что задача сама по себе не справляется с отменой, либо потому, что вы действительно хотите продолжать работу с задачей, но (скажем) отвечаете пользователю: "это займет некоторое время... но это все еще продолжается. Это безопасно, чтобы закрыть ваш браузер."(Или что там еще.)
Нашел это в Белой книге Microsoft:
Также интересно отметить существование перегрузки для задачи.Wait (), который принимает CancellationToken с задачей подписи.Подождите (CancellationToken). Эта перегрузка принимает маркер, так что ожидание может быть отменено; эта перегрузка не имеет ничего общего с отменой задачи, но скорее может привести к преждевременному возвращению ожидания. Если Задача.Используется Wait (ct), и ожидание прерывается, потому что он обнаруживает, что маркер был сигнализирован, затем будет вызвано исключение OperationCanceledException(ct), указывающее, что операция ожидания была отменена.