2012-03-09 44 views
13

Mam operację wyszukiwania, która ma dwie ścieżki, ścieżkę synchroniczną, która zwraca tylko prosty widok i ścieżkę asynchroniczną, która wykonuje wyszukiwanie asynchronicznie, a następnie zwraca widok. Oba są żądaniami GET, więc są częścią tego samego działania.Używanie akcji asynchronicznej do uruchamiania kodu synchronicznego

Problem polega na tym, że po uzyskaniu dostępu do akcji "localhost: XXXX/Home/Search" strona po prostu ładuje się w nieskończoność. Korzystając z Fiddlera, widzę, że prośba nigdy się nie zwraca. Debugowałem go i przechodzi do ostatniego wiersza kodu, ale ponownie żądanie nie jest kompletne.

Mam uprościła repro na następujące kwestie:

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

VS11 ostrzega mnie, że kod będzie działać synchronicznie bez czekają, co jest w porządku, ale wniosek nie kompletne.

Czy to działa? Czy muszę tu zrobić coś jeszcze?

Edit

To MVC 4 kierowanie .NET 4.5.

Edycja 2

Dla tych, którzy widzą rzeczy lepiej w kodzie, to dlaczego muszę synchronicznych w działaniu asynchronicznym:

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

Myślę, że to * powinno * działać, ale z jakiegoś powodu tak nie jest. Ponieważ odrzuca i przechwytuje 'NullReferenceExcpetion' wewnętrznie, myślę, że to błąd. – svick

+1

Wskazówka: Upewnij się, że dziedziczysz z 'AsyncController', a nie' Controller', jeśli Twoje metody działania zwracają 'Task '. – vcsjones

+0

2 @ vcsjones, próbowałem, ale to nie pomaga. I [to nie powinno być konieczne w MVC4] (http://msdn.microsoft.com/en-us/library/system.web.mvc.asynccontroller%28v=vs.108%29.aspx). – svick

Odpowiedz

16

To znany błąd w fazie beta. To quote Stephen Toub:

Krótka odpowiedź jest taka, że ​​jest to znany błąd w ASP.NET MVC w .NET 4.5 Beta, który powoduje ten problem gdy sposób asynchroniczny uzupełnia synchronicznie. Dopóki poprawka nie będzie dostępna, prostym rozwiązaniem jest dodanie "Czekaj na Task.Yield();" jako pierwszy wiersz metody asynchronicznej, wymuszając jej zakończenie asynchronicznie. Aby to działało poprawnie, trzeba także zapewnić, że używasz nowego SynchronizationContext dostarczonego przez ASP.NET w .NET 4.5, co oznacza zapewnienie masz linię:

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

w sekcji appSettings od konfiguracji plik.

Powiązane problemy