2012-08-09 39 views
11

tôi cần phải gọi một phương thức trả về một Task từ bên trongNgăn chặn một bế tắc khi gọi một phương pháp async mà không sử dụng chờ đợi

public override void OnActionExecuting(ActionExecutingContext filterContext) 

Nó sẽ không cho phép tôi thực hiện phương pháp này async nó ném sau

Một mô-đun hoặc bộ xử lý không đồng bộ được hoàn tất trong khi thao tác không đồng bộ vẫn đang chờ xử lý.

và khi gọi

entityStorage.GetCurrentUser().Result 

tôi nhận được một bế tắc. Làm thế nào tôi có thể tránh điều này?

Tôi đã được chơi đùa với nó đến với những thứ như

entityStorage.GetCurrentUser().Result.ConfigureAwait(false).GetAwaiter().GetResult(); 

Nhưng điều này không hoạt động. Tôi làm nó như thế nào? Giải pháp của tôi sẽ cần phải làm việc với ASP.NET 4 và Async Targetting Pack, tôi không thể sử dụng ASP.NET 4.5 như đang triển khai Azure.

+0

Tìm thấy câu trả lời ở đây http://stackoverflow.com/a/5097066/168012 nếu có ai có giải pháp tốt hơn, vui lòng chia sẻ – Tom

+2

Bạn có xuất phát từ 'AsyncController' thay vì 'Controller' không? –

+0

Vui lòng [bầu chọn tại đây] (https://aspnet.codeplex.com/workitem/9582) để nhóm MVC thêm hỗ trợ cho bộ lọc hành động 'async'. –

Trả lời

2

Kể từ khi chờ đợi chỉ là cú pháp đường cho trình biên dịch viết lại phần tiếp theo cho bạn, con đường 'trực tiếp' nhất sẽ là lấy bất kỳ mã nào đi theo sự chờ đợi của bạn và thực hiện cuộc gọi ContinueWith.

Vì vậy, một cái gì đó như:

entityStorage.GetCurrentUser().ContinueWith(t => 
{ 
    // do your other stuff here 
}); 
12

Nguyên nhân gây ra bế tắc là explained here. Tóm lại, không chặn mã số async. Bạn nên sử dụng ConfigureAwait(false) trong thư viện async mã và await kết quả (không sử dụng Result hoặc Wait).

Cập nhật: Vui lòng vote here để nhóm MVC thêm hỗ trợ cho async bộ lọc hành động.

+0

Tôi gặp khó khăn khi tìm liên kết/trang đã nói như vậy, nhưng trước đây tôi đã nói với những người khác rằng nếu cung cấp liên kết (đặc biệt là một bên ngoài SO) bạn nên sao chép các bit khóa vào SO câu trả lời. Nó được đề cập ở đây, mặc dù, FWIW: http://meta.stackexchange.com/questions/118582/what-is-an-acceptable-answer –

+0

Bạn là chính xác; câu hỏi meta bạn đang đề cập đến gần đây đã bị xóa như một phần của chiến lược "làm cho SO đẹp hơn". Tuy nhiên, như Jon Skeet nhận xét: nếu tôi biết câu trả lời và chỉ có thời gian để đăng một liên kết, thì tốt hơn là không có gì. –

+0

Vấn đề tôi gặp phải là nếu tôi cố gắng sử dụng từ khóa async và làm cho phương thức async sau đó phương thức đã ném 'Một mô-đun không đồng bộ hoặc trình xử lý hoàn tất trong khi một thao tác không đồng bộ vẫn đang chờ xử lý.' – Tom

1

Nếu bạn PHẢI convert asynch để synch.

public User GetCurrentUserSynch() 
    { 
     return Task.Run(() => 
     { 
      var asyncResult = entityStorage.GetCurrentUser(); 
      while (!asyncResult.IsCompleted) 
      { 
       Application.Current.TryFindResource(new object()); // This is for WPF but you can do some other nonsense action of your choosing 
      } 

      return asyncResult.Result; 
     }).Result; 
    } 

Nếu không sử dụng @ Câu trả lời của Stephen.

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