サーバー側コード(つまり一部ApiController
)があり、関数が非同期であるため(それらが返さTask<SomeObject>
れる場合)、呼び出す関数を待機するときは常にベストプラクティスと見なされますConfigureAwait(false)
か?
スレッドコンテキストを元のスレッドコンテキストに戻す必要がないため、パフォーマンスが向上することを読みました。ただし、ASP.NET Web Apiでは、リクエストが1つのスレッドで受信され、関数ConfigureAwait(false)
の最終結果を返すときに別のスレッドに入る可能性がある関数と呼び出しを待機している場合ApiController
。
私が話していることの例を以下に入力しました:
public class CustomerController : ApiController
{
public async Task<Customer> Get(int id)
{
// you are on a particular thread here
var customer = await SomeAsyncFunctionThatGetsCustomer(id).ConfigureAwait(false);
// now you are on a different thread! will that cause problems?
return customer;
}
}
HttpContext.Current
ASP.NETによってフローされます。ASP.NETはSynchronizationContext
、デフォルトでフローされますがawait
、フローされませんContinueWith
。大藤、(セキュリティ上の制限を含む)実行コンテキストは、C#でCLRに言及したコンテキストがあり、それはされて両方で流れたContinueWith
とawait
(あなたが使用している場合でもConfigureAwait(false)
)。