Soru WebApi veya MVC denetleyicilerinde ConfigureAwait (false) kullanımında herhangi bir tehlike var mı?


İki senaryo olduğumu söyle:

1) WebApi Denetleyicisi

    [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 Denetleyici

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

Ne zaman kullanmam gerektiğini okuyordum ConfigureAwait ve kullanmam gerektiği gibi görünüyor ConfigureAwait(false) Doğrudan UI'ye bağlı olmayan tüm zaman uyumsuz çağrılarımda. Bunun ne anlama geldiğini bilmiyorum ... kullanmalı mıyım? .ConfigureAwait(false) yukarıdakilerin hepsinde await aramalar?

Tam olarak kullanmam gerektiğinde bazı kesin kurallar arıyorum.

Bu soru ile aynı değil Tüm sunucu tarafı kodları için ConfigureAwait'i çağırmak için en iyi yöntem - Genel C # olarak değil, WebApi ve MVC bağlamında bu yöntem için kullanım durumu hakkında basit bir cevap arıyorum.


21
2017-10-23 01:57


Menşei


@MickyD bunu okurken, "// Bu yöntem, GUI veya ASP.NET bağlamında çağrıldığında bir kilitlenme neden olur." - WebApi ve MVC, .NET bağlamından yararlanamıyor mu? Yukarıdaki senaryoda ne yaparsınız ve neden? - SB2055
@MickyD Birkaç kez okudum ve hala net değilim. Aptal olmalıyım. "ASP.NET'te, bu iş parçacığı, yöntemi sürdürürken istek bağlamına girip girmediğidir." - Bunu yukarıdaki senaryolarda yapmak zorunda mıyım? - Burada basit bir örnek-temelli bir cevaptan yararlanan tek kişi olamayacağım. Bu soru, genel C # 'ye ters olarak API ve MVC'ye göre daha fazla kapalı olduğundan lütfen işaretlemeyin. - SB2055
stackoverflow.com/questions/18970400/...Daha eğlenceli olsaydı ... Diğer taraftan eğer / takımınız çok disiplinliyse ve küresel değerleri (mevcut Http bağlamı veya mevcut kültür gibi) kullanmıyorsanız, her iki şekilde de iyisiniz. Ayrıca stackoverflow.com/questions/13489065/... aradığınız cevaptır - sorununun nasıl farklı olduğunu (ya da neden başka bir cevap beklemediğinizi) açıkça belirtin. ConfigureAwait(false) sunucu tarafı kodunda) - Alexei Levenkov
"ConfigureAwait (false) 'i aramak için bir nokta yok." <Buradaki açıklama şudur: Neden şaşkın kaldım. Çakışan rehberlik basit, örnek tabanlı Cevap. - SB2055


Cevaplar:


doğrudan UI'ye bağlı olmayan tüm uyumsuz çağrılarımda ConfigureAwait (false) kullanmalıyım gibi görünüyor.

Tam olarak değil. Bu kılavuz, UI iş parçacığı olmadığı için burada mantıklı değil.

Parametre geçti ConfigureAwait olduğu continueOnCapturedContextDaha açık bir şekilde senaryoyu açıklar. Kullanmak istiyorsun ConfigureAwait(false) geri kalan her ne zaman async yöntem yapar değil mevcut içeriğe bağlı.

ASP.NET 4.x'te, "içerik" gibi şeyler içeren istek bağlamıdır. HttpContext.Current ve kültür. Ayrıca - ve bu belgelenmemiş kısım - ASP.NET yardımcı yöntemlerinin birçoğu yap istek bağlamına bağlıdır.

(Yan not: ASP.NET Çekirdeği artık bir "içeriğe" sahip değil)

Yukarıdaki tüm çağrılarda .ConfigureAwait (false) kullanmalı mıyım?

Bu konuda herhangi bir rehberlik duymadım, ama tamam olduğundan şüpheleniyorum.

Kendi kodumda asla kullanmam ConfigureAwait(false) Denetleyici eylem yöntemlerimde, istekleri zaten içerik bağlamında tamamlandı. Bana daha doğru geliyor.


30
2017-10-24 13:50



Çok teşekkür ederim! - SB2055
Bu Stephen’daki herhangi bir güncelleme var mı? Asp.net çekirdek mvc'de denetleyici kodu yazıyor ve kullanmanın ne gibi anlamları olduğunu merak ediyorum. ConfigureAwait(false). Yan notunuz gerçekten yardımcı olmuyor - ASP.NET Core'un bir bağlamı yoksa, bu benim kullanmam gerektiği anlamına mı geliyor? ConfigureAwait(false)? - David Clarke
@DavidClarke: Hiçbir bağlam olmadığından ConfigureAwait(false) etkisi yok. Daha fazla bilgi: blog.stephencleary.com/2017/03/... - Stephen Cleary
@StephenCleary teşekkürler, bu son derece yararlı bir referans oldu - David Clarke


Kullanabilirsin ConfigureAwait kamu eylemi MVC Denetleyici, eğer anlaşma kilitleme önlemek için yardımcı olur _userService.GetAuthViewModelAsync Beklemeye devam ediyor. zaman uyumsuz hizmet bekler UI httpcontext engelleyebilir tarafından bekletilmesi durumunda bulut yükseltmek bulut

Bu durumu anlamak için aşağıdaki linke bakınız:

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


-1
2017-10-24 10:44