7

フォローアップthis question。私は薄くラップする多くの非同期メソッドを持つライブラリを持っていますHttpClient。効果的に、彼らはいくつかのセットアップを行うと、直接HttpClient呼び出しから返さTaskを返す:私はこれらの呼び出しにConfigureAwait(false)を追加するかどうかを熟考してい別のライブラリへの呼び出しからタスクを直接返すライブラリでConfigureAwait(false)を使用すると便利ですか?

public Task DoThingAsyc() { 
    // do some setup 
    return httpClient.DoThingAsync(); 
} 

。支配的な知恵は、「はい、図書館では常にそうしている」と思われます。 ConfigureAwaitは、メソッドのシグネチャを変更しないようにするためにバックTaskにラップされる必要があるであろうConfiguredTaskAwaitable返すためしかし、この場合には、いくつかの(恐らく無視できる)オーバーヘッドを導入するであろう。確かにハードコードにない:

public async Task DoThingAsyc() { 
    // do some setup 
    return await httpClient.DoThingAsync().ConfigureAwait(false); 
} 

私の質問があり、ConfigureAwait(false)の効率の利点は、おそらくこのケースで導入余分なオーバーヘッドを上回るだろうか?上記の例は、より良いプラクティスと見なされますか?

答えて

10

いいえ、しないでください。

awaitを使用していないので、事前に設定する必要はありません。 ConfigureAwaitコールを行うのは、図書館の発信者の責任です。そして、発信者はの代わりにConfigureAwait(true)に電話したいと思うかもしれません。あなたはそれを知らないのです。

ライブラリーコードでConfigureAwait(false)を呼び出すのは、がライブラリで待機している場合にのみ、ベストプラクティスです。それが返された場合、例えば(

Task<Something> DoSomethingAsync() 
{ 
    return DoSomethingElseAsync(); 
} 

場合DoSomethingElseAsyncTask契約:ほとんどの場合、このような、コードで

Task<Something> DoSomethingAsync() 
{ 
    return await DoSomethingElseAsync().ConfigureAwait(false); 
} 

は同等です例外をスローする代わりにTaskが失敗しました)。

付加的なステートマシンを作成するには、付加価値のないラッピングコードの1つのレイヤーを追加するだけです。Taskを直接返すほうがよいでしょう。

つまり、は効率化の効果がありません。はこれとは全く反対です。

+0

その場合 - ライブラリ内の 'ConfigureAwait'を待っています。 – GSerg

+0

@GSerg私は私の答えを広げるよ –

+0

ありがとう!私はこれらも同様に良い答えだと思っていますが、最初にキメをした男にそれをあげてください。 –

7

いいえ、ConfigureAwaitのように、awaitが設定されています。 awaitが必要ない場合は、設定する必要はありません。

ConfigureAwaitを使用するには、async-awaitを追加するだけで、メソッドには影響し、呼び出しメソッドには影響しないため、付加価値はありません。呼び出し側がConfigureAwaitを使用する必要がある場合、彼らは自分たちはそうします。代わりに、単純なTask -returningメソッドの非同期メソッドを持つ

は、多くの理由(例えばための有効な選択肢であります例外処理)、それにはConfigureAwaitを使用する必要がありますが、ConfigureAwaitを使用する必要はありません。

+5

おかしい、私はしばらくこのことを熟考してきましたが、皆さんが指摘するまで私には起こりませんでした - 「待っていないので、あなたは何を設定していますか?目の新鮮なセットの利点! –

関連する問題