これは、コードに冗長な待機時間を導入する非常に一般的な現象です。
例:要するに、私たちはこのような何かを見ています。 で
public Task ExecuteAsync(Func<Task> taskAction)
{
return taskAction();
}
(1) await ExecuteAsync(() => Task.Delay(5000));
vs :
(2) await ExecuteAsync(async () => await Task.Delay(5000));
(1)あなたが再試行ポリシーに渡されたデリゲートによって作成されたタスクを待っています。 で
(2)あなたはあなたの内側のは、あなたがに待望のタスクの待ちはあなたが待機するために呼び出すときに別のタスクが作成された(1)待つ 、異なるタスク、その時に冗長1を待っていますExecuteAsync。
これは、コードが同じように動作し、ExecuteAsyncによって返されたタスクを待機しているために機能します。 追加のタスクを作成するだけで、途中でもう少し重いことができます(理由はありません)。
RetryPolicy.cs
ExecuteAsync.cs
ここ教訓は、あなたが意図したタスクを待つことです。また
:
そこに守備の冗長化のawaitのうちの充当であるが、非常に重要であり、その冗長のように見えるものも。例えば
:
これは、非同期(exmpale用I/O)操作が完了するまで接続が配置されるべきではない操作 を読み取ります。
await DoSomeReadingAsync();
public async Task DoSomeReadingAsync()
{
using(var connection = new Connection())
{
await SomeReadOperationAsync(connection);
}
}
あなたはここでそれを待たずに、内部タスクを返した場合、内部の非同期操作が行われる前に、接続が配置されますので、それは destorusになります。
await DoSomeReadingAsync();
public Task DoSomeReadingAsync()
{
using(var connection = new Connection())
{
return SomeReadOperationAsync(connection);
}
}
どちらも正しいです。より詳細な情報に興味があるなら、私は[私のブログに]書きました(http://blog.stephencleary.com/2016/12/eliding-async-await。html)。 –