13

非同期ではないがを返すメソッドがあるとします。Task(定義は非同期実装用にも意図されているインターフェースからのものであるため)

public Task DoWorkAsync(Guid id)
{
     // do the work

     return ...;
}

返すための最良のオブジェクトは何ですか?私の現在の選択肢:

return Task.Yield();
return Task.FromResult<object>(null);

// any of the other but cached in a static field and reused.


  • サイドノート - 可能であれば、非同期操作を行わない別のインターフェースを導入してください(ISP原則) - Sergey Berezovskiy
  • @SergeyBerezovskiy - このような場合の最大の問題は、呼び出し側が提供されている実装に応じて2つのインターフェースを切り替える必要があることです(たとえば、IoCによって)。その間にラッパーを作成することもできますが、そのためには元の質問が依然として重要です。 - Knaģis

2 답변


17

あなたは戻ることができませんTask.Yield()ではないTaskしかしYieldAwaitableで使用するためawaitそして、それは実際には非同期性を導入します。詳細はこちら

私が使うTask.FromResult(Type.Missing)この目的のために。おそらく、文書化されていないにもかかわらず最も効率的なオプションはTask.Delay(0)静的な完了タスクを返します


  • 読みやすさのために、私は前者と行きます。 - Yuval Itzchakov
  • @YuvalItzchakov、私も。また、独自のタスクも返します。Task.Delay(0)。必要に応じて、キャッシュすることができます。 - noseratio
  • +1。好きTask.FromResult<object>(null)しかし、.NETチームは好む傾向がありますTask.FromResult(0)。どちらもキャッシュされていません。 - Stephen Cleary
  • 文書化されていないオプションが好きです。それを仮定することがどれほど安全かと思います0x4000「破棄しない」という意味です。そして作成してキャッシュするnew Task(false, (TaskCreationOptions)0x4000, System.Threading.CancellationToken.None)あなた自身… - Knaģis
  • @Knaģis、おそらく悪い考えかもしれませんが、いつでも変更することができます:)さらに、このコンストラクタのオーバーライドは非公開です。リフレクションを使用する必要があります。 - noseratio

19

Microsoft.net 4.6では、Taskクラスはこの目的のために静的プロパティを持ちます。

Task.CompletedTask

https://msdn.microsoft.com/en-us/library/system.threading.tasks.task.completedtask(v=vs.110).aspx

リンクされた質問


関連する質問

最近の質問