Is er enig gevaar bij het gebruik van ConfigureAwait(false) in WebApi- of MVC-controllers?

Stel dat ik twee scenario’s heb:

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);
        }
    }

Ik heb gelezen wanneer ik ConfigureAwaitmoet gebruiken en het lijkt erop dat ik ConfigureAwait(false)moet gebruiken voor AL mijn asynchrone oproepen die niet gebonden zijn rechtstreeks naar de gebruikersinterface. Ik weet echter niet wat dat betekent… moet ik .ConfigureAwait(false)gebruiken voor alle bovenstaande await-oproepen?

Ik ben op zoek naar een aantal ondubbelzinnige richtlijnen over wanneer ik het precies moet gebruiken.

Deze vraag is NIET hetzelfde als de Beste oefenen om ConfigureAwait aan te roepen voor alle code aan de server– Ik ben op zoek naar een duidelijk antwoord op de use-case voor deze methode in de context van WebApi en MVC, niet als algemene C#.


Antwoord 1, autoriteit 100%

het lijkt erop dat ik ConfigureAwait(false) moet gebruiken voor AL mijn asynchrone oproepen die niet rechtstreeks aan de gebruikersinterface zijn gekoppeld.

Niet helemaal. Die richtlijn is hier niet logisch, omdat er geen UI-thread is.

De parameter die wordt doorgegeven aan ConfigureAwaitis continueOnCapturedContext, wat het scenario duidelijker uitlegt. U wilt ConfigureAwait(false)gebruiken wanneer de rest van die async-methode nietafhankelijk is van de huidige context.

In ASP.NET 4.x is de “context” de aanvraagcontext, die zaken als HttpContext.Currenten cultuur omvat. Ook – en dit is het ongedocumenteerde deel – zijn veel van de ASP.NET-helpermethoden welafhankelijk van de aanvraagcontext.

(Kanttekening: ASP.NET Core heeft niet langer een “context”)

moet ik .ConfigureAwait(false) gebruiken voor alle bovenstaande wachtende oproepen?

Ik heb hier geen duidelijke richtlijnen over gehoord, maar ik vermoed dat het in orde is.

In mijn eigen code gebruik ik nooit ConfigureAwait(false)in mijn controller-actiemethoden, zodat ze al binnen de aanvraagcontext worden voltooid. Het lijkt me juister.


Antwoord 2

Als er geen daadwerkelijke context is in een ASP.NET Core-toepassing, zou het geen kwaad of goed zijn om .ConfigureAwait(false) toe te voegen aan uw te verwachten methoden in controllers.

Als er echter een kans bestaat dat er in de toekomst, om wat voor reden dan ook, zoiets als een context is waarmee rekening moet worden gehouden zoals in ASP.NET 4, dan is dat een ander verhaal. We zouden niet het risico kunnen nemen om in een andere context te draaien, tenzij we er geen donder om geven (in dat geval zouden we elke thread kunnen gebruiken die beschikbaar is voor verwerking, waardoor mogelijk de prestaties verbeteren).

Mijn keuze hier is om ConfigureAwait(false) toe te voegen, zelfs als het niet wordt gebruikt.


Antwoord 3

U kunt ConfigureAwaitgebruiken voor openbare actie MVC-controller, het helpt om deallock te voorkomen als uw _userService.GetAuthViewModelAsyncblijft wachten.
de cloud verhoogt de impasse als de asynchrone service blijft wachten, dus door de httpcontext van de gebruikersinterface te blokkeren.

Kijk onderstaande link om deze zaak te begrijpen:

http://blog.stephencleary.com/ 2012/07/dont-block-on-async-code.html


Antwoord 4

Het gebruik van ConfigureAwait(false)in controllers klinkt niet goed voor mij omdat het de hoofdthread laat wachten tot de bewerking is voltooid. Het beste wat ik bedacht is om het te gebruiken in je Service/Business-laag en Persistance-laag.

Other episodes