web-dev-qa-db-ja.com

WebApiまたはMVCコントローラーでConfigureAwait(false)を使用することに危険はありますか?

次の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#としてではありません。

39
SB2055

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)を使用しないため、リクエストコンテキスト内で既に完了しています。私にはちょうどよさそうです。

56
Stephen Cleary