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