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

时间:2012-08-23 21:11:42

标签: c# asynchronous task-parallel-library async-await c#-5.0

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

我不清楚的一件事是何时使用SetResultSetExceptionSetCancelTrySetResultTrySetException和{{1 }}

这就是MSDN所说的:

  

如果任务已经在,则此操作将返回false   三个最终状态之一:RanToCompletion,Faulted或Cancelled。

     

如果底层任务有,则此方法也返回false   已被处置。

好的,我明白了,但它并没有真正提供关于何时或为何使用其中一个的指导。

那么,这笔交易是什么?

2 个答案:

答案 0 :(得分:62)

怀疑关键在于,如果只有一件事会设置结果,只需拨打SetResult等等。如果你最后拨打SetResult两次,那就是表示错误。 (同样,如果已处置TaskCompletionSource。)

如果您有多个线程可以同时尝试设置结果(例如,它是指示几个并行Web服务调用中的第一个结果),那么使用TrySetResult,因为它是多个线程“尝试”设置结果是完全合理的,不知道另一个线程是否已经设置了它。

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

答案 1 :(得分:3)

除了 Jon 的回答之外,MS 文档门户还提到了 TrySetResult

如果 Task<TResult> 已经处于三个最终状态之一,此操作将返回 false:

  • RanToCompletion
  • 故障
  • 已取消

链接:https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.taskcompletionsource-1.trysetresult?view=net-5.0