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

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

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

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

эта операция вернет false, если задача уже находится в одно из трех окончательных состояний: Рантозавершение, ошибка или отмена.

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

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

Итак, в чем же дело?

1 ответов


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

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

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