2012-03-09 39 views
13

Tôi có một hành động tìm kiếm có hai đường dẫn, một đường dẫn đồng bộ, trả về một khung nhìn đơn giản và đường dẫn không đồng bộ, tìm kiếm không đồng bộ và sau đó trả về một dạng xem. Cả hai đều là các yêu cầu GET, vì vậy chúng là một phần của cùng một hành động.Sử dụng Hành động Không đồng bộ để Chạy Mã Đồng bộ

Vấn đề là khi tôi truy cập vào hành động "localhost: XXXX/Home/Search", trang chỉ tải vô hạn. Sử dụng Fiddler, tôi có thể thấy rằng yêu cầu không bao giờ trả về. Tôi đã gỡ lỗi nó và nó làm cho nó vào dòng cuối cùng của mã, nhưng, một lần nữa, yêu cầu không hoàn thành.

tôi đã đơn giản hoá repro như sau:

public async Task<ActionResult> Search() 
{ 
    return View(); 
} 

VS11 cảnh báo tôi rằng mã sẽ được chạy đồng bộ mà không có một chờ đợi, đó là tốt, nhưng yêu cầu không hoàn chỉnh.

Công việc này có nên không? Hay tôi cần phải làm gì khác ở đây?

Sửa

Đây là MVC 4 nhắm mục tiêu NET 4.5.

Chỉnh sửa 2

Đối với những người nhìn thấy mọi thứ tốt hơn trong mã, đây là lý do tại sao tôi cần phải đồng bộ trong một hành động async:

public async Task<ActionResult> Search(string query = null) 
{ 
    if (string.IsNullOrWhiteSpace(query)) 
     return View(new SearchViewModel()); // never loads 

    var model = await _someService.SearchAsync(query); 
    return View(model); // loads 
} 
+0

Tôi nghĩ rằng điều này * nên * hoạt động, nhưng vì một số lý do thì không. Kể từ khi nó ném và bắt một 'NullReferenceExcpetion' nội bộ, tôi nghĩ rằng đó là một lỗi. – svick

+1

Mẹo: Đảm bảo bạn kế thừa từ 'AsyncController', không phải 'Bộ điều khiển' nếu Phương thức hành động của bạn đang trả về' Task '. – vcsjones

+0

2 @ vcsjones, tôi đã thử điều đó, nhưng nó không giúp ích gì. Và [nó không cần thiết trong MVC4] (http://msdn.microsoft.com/en-us/library/system.web.mvc.asynccontroller%28v=vs.108%29.aspx). – svick

Trả lời

16

Đây là một lỗi được biết đến trong các phiên bản beta. To quote Stephen Toub:

Câu trả lời ngắn gọn là có lỗi đã biết trong ASP.NET MVC trong .NET 4.5 Beta dẫn đến sự cố khi phương thức async hoàn tất đồng bộ. Cho đến khi một sửa chữa có sẵn, một cách giải quyết đơn giản là thêm "await Task.Yield();" là dòng đầu tiên của phương thức async, buộc nó hoàn thành không đồng bộ. Để làm việc này một cách chính xác, bạn cũng cần phải đảm bảo bạn đang sử dụng SynchronizationContext mới được cung cấp bởi ASP.NET trong .NET 4.5, có nghĩa là đảm bảo bạn có dòng:

<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /> 

trong phần appSettings của cấu hình của bạn tập tin.

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