Utilizzando un'azione ASYNC per eseguire il codice sincrono
-
09-12-2019 - |
Domanda
Ho un'azione di ricerca che ha due percorsi, un percorso sincrono, che restituisce una visione semplice e un percorso asincrono, che fa la ricerca asincrono e quindi restituisce una vista. Entrambi ricevono richieste, quindi fanno parte della stessa azione.
Il problema è che quando accedo all'azione "localhost: xxxx / home / search", la pagina carica infinitamente. Usando Fiddler, posso vedere che la richiesta non torna mai. L'ho debungato e lo rendono all'ultima riga di codice, ma ancora, la richiesta non completa.
Ho semplificato la riproduzione al seguente:
public async Task<ActionResult> Search()
{
return View();
}
.
VS11 mi avverte che il codice verrà eseguito in modo sincrono senza attendere, che va bene, ma la richiesta non completa.
dovrebbe funzionare? O devo fare qualcos'altro qui?
Modifica
Questo è MVC 4 Targeting .NET 4.5.
Modifica 2
Per coloro che vedono le cose migliori nel codice, questo è il motivo per cui ho bisogno di sincrono in un'azione asincrona:
.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
}
Soluzione
Questo è un bug noto nella beta. per citare Stephen toub:
.La risposta breve è che c'è un bug noto in ASP.NET MVC nella beta .NET 4.5 che si traduce in questo problema quando il metodo ASYNC è stato completato in modo sincrono.Fino a quando non è disponibile una soluzione, una semplice soluzione alternativa è quella di aggiungere "Await Task.yield ();"Come la prima riga del metodo Async, costringendolo a completare in modo asincrono.Per questo funziona correttamente, è inoltre necessario assicurarsi di utilizzare il nuovo SynchronizationContext fornito da ASP.NET in .NET 4.5, il che significa assicurarti di avere la linea:
.<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
Nella sezione AppSETTISSS del file di configurazione.