58

TPL、 C#5の新機能async/機能、およびの謎に頭を悩ませようとしています。awaitTaskCompletionSource

私にははっきりしないことの1つは、、、、および対、、SetResultおよびをいつ使用するかです。SetExceptionSetCancelTrySetResultTrySetExceptionTrySetCancel

これはMSDNが言わなければならないことです:

タスクがRanToCompletion、Faulted、またはCanceledの3つの最終状態のいずれかにすでにある場合、この操作はfalseを返します。

基になるタスクがすでに破棄されている場合も、このメソッドはfalseを返します。

わかりました。わかりましたが、どちらを使用するのか、なぜ使用するのかについてのガイダンスは実際には提供されていません。

それで、取引は何ですか?

4

2 に答える 2

80

結果を設定するものが1つしかない場合は、電話をかけるSetResultなどしてください。2SetResult回電話をかけることになった場合は、バグを示していると思います。(同様に、TaskCompletionSourceが処分されている場合。)

すべてが同時に結果を設定しようとしている可能性のある複数のスレッドがある場合(たとえば、複数の並列Webサービス呼び出しからの最初の結果を示すためにある場合)、TrySetResult複数のスレッドが「試す」ことは完全に合理的であるため、を使用します。 "結果を設定するには、別のスレッドがすでに結果を設定しているかどうかはわかりません。

公式のガイダンスは見たことがありませんが、それは理にかなっています。

于 2012-08-23T21:14:53.257 に答える
3

Jonの回答に加えて、MSドキュメントポータルは次のように述べていますTrySetResult

Task<TResult>がすでに3つの最終状態のいずれかにある場合、この操作は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 に答える