TaskCompletionSource:何时使用SetResult()与TrySetResult()等
我试图围绕TPL,C#5中新的async
/ await
function,以及TaskCompletionSource
的奥秘。
有一件事情我不清楚的是什么时候使用SetResult
, SetException
和SetCancel
与TrySetResult
, TrySetException
和TrySetCancel
。
这是MSDN必须说的:
如果任务已处于三种最终状态之一,则此操作将返回false:RanToCompletion,Faulted或Canceled。
如果基础任务已经被处置,这个方法也返回false。
好吧,我明白了,但它并没有真正提供任何指导什么时候或为什么要使用一个。
那么,交易是什么?
我怀疑的一点是,如果只有一件事情将被设置的结果,只要调用SetResult
等如果你最终调用SetResult
两次,这表明一个错误。 (同样,如果TaskCompletionSource
已经被处理了。)
如果你有几个线程可能都试图同时设置结果(例如,在那里指出几个并行Web服务调用中的第一个结果),那么使用TrySetResult
,因为multithreading完全合理的“尝试“设置结果,不知道另一个线程是否已经设置它。
我还没有看到任何官方的指导,但这是有道理的。