次の2つのシナリオがあるとします。
1)WebApi Controller
_ [System.Web.Http.HttpPost]
[System.Web.Http.AllowAnonymous]
[Route("api/registerMobile")]
public async Task<HttpResponseMessage> RegisterMobile(RegisterModel model)
{
var registerResponse = await AuthUtilities.RegisterUserAsync(model, _userService, User);
if (registerResponse.Success) {
var response = await _userService.GetAuthViewModelAsync(model.Username, User);
return Request.CreateResponse(HttpStatusCode.OK, new ApiResponseDto() { Success = true, Data = response });
}
else {
return Request.CreateResponse(HttpStatusCode.OK, registerResponse);
}
}
_
2)MVC Controller
_ [Route("public")]
public async Task<ActionResult> Public()
{
if (User.Identity.IsAuthenticated)
{
var model = await _userService.GetAuthViewModelAsync(User.Identity.Name);
return View("~/Views/Home/Index.cshtml", model);
}
else
{
var model = await _userService.GetAuthViewModelAsync(null);
return View("~/Views/Home/Index.cshtml", model);
}
}
_
私はConfigureAwait
をいつ使用すべきかを読み上げており、UIに直接結び付けられていないすべての非同期呼び出しでConfigureAwait(false)
を使用する必要があるようです。私はそれが何を意味するのか分からない...上記のすべてのawait
呼び出しで.ConfigureAwait(false)
を使用する必要がありますか?
正確に使用すべき時期について、明確なガイドラインを探しています。
この質問は すべてのサーバー側コードに対してConfigureAwaitを呼び出すためのベストプラクティス とは異なります-WebApiおよびMVCのコンテキストでこのメソッドのユースケースに関する簡単な答えを探しています。一般的なC#としてではありません。
uIに直接結び付けられていないすべての非同期呼び出しでConfigureAwait(false)を使用する必要があるようです。
そうでもない。 UIスレッドがないため、このガイドラインはここでは意味がありません。
ConfigureAwait
に渡されるパラメーターはcontinueOnCapturedContext
であり、シナリオをより明確に説明しています。そのasync
メソッドの残りがnotが現在のコンテキストに依存するときはいつでも、ConfigureAwait(false)
を使用したい。
ASP.NET 4.xでは、「コンテキスト」は要求コンテキストであり、_HttpContext.Current
_やカルチャなどが含まれます。また-これは文書化されていない部分です-ASP.NETヘルパーメソッドの多くdoはリクエストコンテキストに依存しています。
(補足:ASP.NET Coreには「コンテキスト」がなくなりました)
上記のすべての待機呼び出しで.ConfigureAwait(false)を使用する必要がありますか?
これに関する確固たるガイダンスは聞いていませんが、大丈夫だと思います。
私のコードでは、コントローラーアクションメソッドでConfigureAwait(false)
を使用しないため、リクエストコンテキスト内で既に完了しています。私にはちょうどよさそうです。