2016-10-23 17 views
20

Nói rằng tôi có hai kịch bản:Có nguy hiểm nào khi sử dụng ConfigureAwait (false) trong bộ điều khiển WebApi hoặc MVC không?

1) WebAPI khiển

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

Tôi đã được đọc lên trên khi tôi nên sử dụng ConfigureAwait và có vẻ như tôi nên sử dụng ConfigureAwait(false) trên TẤT CẢ các cuộc gọi không đồng bộ của tôi không được liên kết trực tiếp với giao diện người dùng. Tôi không biết điều đó có nghĩa là gì ... tôi có nên sử dụng .ConfigureAwait(false) trên tất cả các cuộc gọi await ở trên không?

Tôi đang tìm một số nguyên tắc rõ ràng về thời điểm chính xác tôi nên sử dụng nó.

Câu hỏi này KHÔNG giống như Best practice to call ConfigureAwait for all server-side code - Tôi đang tìm câu trả lời đơn giản về trường hợp sử dụng cho phương pháp này trong ngữ cảnh của WebApi và MVC, không phải là C# chung.

+0

@MickyD đọc điều đó, tôi thấy "// Phương pháp này gây ra bế tắc khi được gọi trong ngữ cảnh GUI hoặc ASP.NET." - WebApi và MVC có tận dụng ngữ cảnh .NET không? Bạn sẽ làm gì trong kịch bản trên và tại sao? – SB2055

+1

@MickyD Tôi đã đọc nhiều lần và vẫn chưa rõ. Tôi phải ngu ngốc. "làm trong ASP.NET là liệu chuỗi đó có đi vào ngữ cảnh yêu cầu khi tiếp tục lại phương thức hay không." - * Tôi có cần phải làm điều này trong các tình huống trên không? * - Tôi không thể là người duy nhất được hưởng lợi từ một câu trả lời đơn giản ở đây ... Xin đừng đánh dấu là đã đóng vì câu hỏi này là nhiều hơn hướng tới API và MVC như trái ngược với C# chung. – SB2055

+1

http://stackoverflow.com/questions/18970400/async-await-unexpected-behaviour-of-configureawait sẽ giải trí thú vị hơn ... Mặt khác nếu bạn/nhóm của bạn rất kỷ luật và không bao giờ sử dụng các giá trị toàn cầu (như ngữ cảnh hiện tại của Http hoặc văn hóa hiện tại) bạn cũng ổn. Ngoài ra http://stackoverflow.com/questions/13489065/best-practice-to-call-configureawait-for-all-server-side-code là câu trả lời bạn đang tìm kiếm - không thực sự rõ ràng câu hỏi của bạn khác nhau như thế nào (hoặc tại sao bạn mong đợi bất kỳ câu trả lời nào khác hơn - không có điểm để gọi 'ConfigureAwait (false)' trong mã phía máy chủ) –

Trả lời

24

nó có vẻ như tôi nên sử dụng ConfigureAwait (false) trên tất cả các cuộc gọi async của tôi không được gắn trực tiếp vào giao diện người dùng.

Không hoàn toàn. Hướng dẫn đó không có ý nghĩa ở đây, vì không có chuỗi giao diện người dùng.

Thông số được chuyển đến ConfigureAwaitcontinueOnCapturedContext, giải thích rõ hơn trường hợp. Bạn muốn sử dụng ConfigureAwait(false) bất cứ khi nào phần còn lại của phương thức async nào không phụ thuộc vào ngữ cảnh hiện tại.

Trong ASP.NET 4.x, "ngữ cảnh" là ngữ cảnh yêu cầu, bao gồm những thứ như HttpContext.Current và văn hóa. Ngoài ra - và đây là phần không có giấy tờ - rất nhiều phương thức trợ giúp ASP.NET do phụ thuộc vào ngữ cảnh yêu cầu.

(Side lưu ý: ASP.NET lõi không còn có một "bối cảnh")

tôi nên sử dụng .ConfigureAwait (false) trên tất cả những điều trên cuộc gọi đang chờ đợi?

Tôi chưa nghe hướng dẫn cụ thể nào về vấn đề này, nhưng tôi nghi ngờ điều đó là ổn.

Trong mã của riêng tôi, tôi không bao giờ sử dụng ConfigureAwait(false) trong các phương thức hành động điều khiển của mình, để chúng hoàn thành trong ngữ cảnh yêu cầu. Nó có vẻ đúng hơn với tôi.

+0

Cảm ơn bạn rất nhiều! – SB2055

+0

Mọi cập nhật về Stephen này? Tôi đang viết mã điều khiển trong mvc lõi asp.net và tự hỏi những gì các tác động được sử dụng/không sử dụng 'ConfigureAwait (false)'. Ghi chú bên của bạn không thực sự hữu ích - nếu ASP.NET Core không có ngữ cảnh, điều đó có nghĩa là tôi nên sử dụng 'ConfigureAwait (false)'? –

+1

@DavidClarke: Vì không có ngữ cảnh, 'ConfigureAwait (false)' không có hiệu lực. Thông tin thêm: https://blog.stephencleary.com/2017/03/aspnetcore-synchronization-context.html –

-1

Bạn có thể sử dụng ConfigureAwait trên hành động nào MVC Controller, nó giúp ngăn chặn khóa thỏa thuận nếu bạn _userService.GetAuthViewModelAsync giữ chờ đợi. điện toán đám mây tăng bế tắc nếu dịch vụ không đồng bộ tiếp tục chờ đợi bằng cách chặn httpcontext giao diện người dùng.

Có cái nhìn dưới đây liên kết để hiểu trường hợp này:

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

Các vấn đề liên quan