我试图围绕TPL,C#5中新的async
/ await
功能以及TaskCompletionSource
的奥秘。
我不清楚的一件事是何时使用SetResult
,SetException
和SetCancel
与TrySetResult
,TrySetException
和{{1 }}
这就是MSDN所说的:
如果任务已经在,则此操作将返回false 三个最终状态之一:RanToCompletion,Faulted或Cancelled。
如果底层任务有,则此方法也返回false 已被处置。
好的,我明白了,但它并没有真正提供关于何时或为何使用其中一个的指导。
那么,这笔交易是什么?
答案 0 :(得分:62)
我怀疑关键在于,如果只有一件事会设置结果,只需拨打SetResult
等等。如果你最后拨打SetResult
两次,那就是表示错误。 (同样,如果已处置TaskCompletionSource
。)
如果您有多个线程可以同时尝试设置结果(例如,它是指示几个并行Web服务调用中的第一个结果),那么使用TrySetResult
,因为它是多个线程“尝试”设置结果是完全合理的,不知道另一个线程是否已经设置了它。
我没有看到任何关于它的官方指导,但这是有道理的。
答案 1 :(得分:3)
除了 Jon 的回答之外,MS 文档门户还提到了 TrySetResult
:
如果 Task<TResult>
已经处于三个最终状态之一,此操作将返回 false: