TaskCompletionSource:何时使用SetResult()与TrySetResult()等

我试图围绕TPL,C#5中新的async / awaitfunction,以及TaskCompletionSource的奥秘。

有一件事情我不清楚的是什么时候使用SetResultSetExceptionSetCancelTrySetResultTrySetExceptionTrySetCancel

这是MSDN必须说的:

如果任务已处于三种最终状态之一,则此操作将返回false:RanToCompletion,Faulted或Canceled。

如果基础任务已经被处置,这个方法也返回false。

好吧,我明白了,但它并没有真正提供任何指导什么时候或为什么要使用一个。

那么,交易是什么?

怀疑的一点是,如果只有一件事情将被设置的结果,只要调用SetResult等如果你最终调用SetResult两次,这表明一个错误。 (同样,如果TaskCompletionSource已经被处理了。)

如果你有几个线程可能都试图同时设置结果(例如,在那里指出几个并行Web服务调用中的第一个结果),那么使用TrySetResult ,因为multithreading完全合理的“尝试“设置结果,不知道另一个线程是否已经设置它。

我还没有看到任何官方的指导,但这是有道理的。