58

我试图围绕 TPL、C# 5 中的新async/await功能以及TaskCompletionSource.

我不清楚的一件事是何时使用SetResult,SetExceptionSetCancelvs TrySetResult, TrySetExceptionand TrySetCancel

这是 MSDN 不得不说的:

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

如果底层任务已被释放,此方法也会返回 false。

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

那么,有什么关系呢?

4

2 回答 2

80

怀疑重点是,如果只有一件事会设置结果,只需调用SetResult等。如果您最终调用SetResult两次,则表明存在错误。(同样,如果TaskCompletionSource已被处置。)

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

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

于 2012-08-23T21:14:53.257 回答
3

除了乔恩的回答之外,MS 文档门户网站还说TrySetResult

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

  • RanToCompletion
  • 故障
  • 取消

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

于 2021-03-19T10:34:43.143 回答