Подтвердить что ты не робот

TaskCompletionSource: когда использовать SetResult() и TrySetResult() и т.д.

Я пытаюсь обернуть голову вокруг TPL, новые функции async/await на С# 5 и тайны TaskCompletionSource.

Мне не ясно, когда использовать SetResult, SetException и SetCancel по сравнению с TrySetResult, TrySetException и TrySetCancel.

Это то, что MSDN должно сказать:

Эта операция вернет false, если Задача уже находится в одно из трех конечных состояний: RanToCompletion, Faulted или Canceled.

Этот метод также возвращает false, если основная задача имеет уже размещены.

Хорошо, я понимаю, но на самом деле он не дает никаких указаний о том, когда и почему использовать один над другим.

Итак, что сделка?

4b9b3361

Ответ 1

Я подозреваю, что если есть только одна вещь, которая будет устанавливать результат, просто вызовите SetResult и т.д. Если вы дважды вызываете SetResult, это указывает на ошибку. (Аналогично, если TaskCompletionSource был удален.)

Если у вас есть несколько потоков, которые все могут пытаться установить результат в одно и то же время (например, там, чтобы указать первый результат из нескольких параллельных вызовов веб-сервисов), используйте TrySetResult, поскольку он полностью разумен для нескольких потоков, чтобы "попытаться" установить результат, не зная, установлен ли еще один поток.

Я не видел никаких официальных указаний по этому вопросу, но это имело бы смысл.