Async PartialView causa l'eccezione "HttpServerUtility.Execute bloccato ..."


85

Ho una vista parziale che cerca di recuperare un IEnumerable<Post>dal database usando async ...

Metodo

public static class PostService
{
    public static int PostsPerPage = 50;

    public static async Task<IEnumerable<Post>> GetRecentAsync(int page = 0)
    {
        return await entityFrameworkDbContext.Posts
            .ToListAsync();
    }
}

PartialView

public async Task<ActionResult> Recent(int page = 0)
{
    return PartialView(await PostService.GetRecentAsync(page));
}

E poi se provo a chiamarlo

@Html.Action("Recent", "Post")

Ottengo la seguente eccezione

HttpServerUtility.Execute bloccato durante l'attesa del completamento di un'operazione asincrona.

Descrizione: si è verificata un'eccezione non gestita durante l'esecuzione della richiesta Web corrente. Esaminare l'analisi dello stack per ulteriori informazioni sull'errore e sulla sua origine nel codice.

Dettagli eccezione: System.InvalidOperationException: HttpServerUtility.Execute bloccato durante l'attesa del completamento di un'operazione asincrona.

Perché ricevo questo errore? Non dovrebbe funzionare?

Risposte:


97

Le azioni figlio devono essere richiamate in modo sincrono. Problema 601 Inoltre, non sono a conoscenza di aggiornamenti recenti alle librerie MVC correnti che consentono questa funzionalità.

Un commento sul numero 601, suggerisce l'aggiunta di questa funzionalità in MVC vNext, aka. MVC6. Le azioni figlio sembrano essere sostituite con le ViewComponentquali possono essere richiamate in modo asincrono da una vista come di seguito. Esempi completi qui e qui

<div>
@await Component.InvokeAsync("YourComponent")
</div>

Per ulteriori informazioni su MVC6, visita http://www.asp.net/vnext/overview/aspnet-vnext/overview

Nota: questa risposta è solo una formalità, quindi la domanda può essere contrassegnata come risposta


il collegamento 601 non è più valido
Serge

6

Una soluzione alternativa per questo problema è rendere il metodo sincronizzato come richiesto da MVC, cancellare il SynchronizationContext, chiamare il metodo asincrono e attendere il risultato, quindi ripristinare il contesto.

vedere la mia risposta completa qui


3
(Questo post non sembra fornire una risposta di qualità alla domanda. Modifica la tua risposta o semplicemente pubblicala come commento alla domanda).
sɐunıɔ ןɐ qɐp
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.