2016-02-09 17 views
5

Nel mio codice, ho usato per caricare un'entità correlata usando await FindAsync, sperando che mi adeguassi meglio alle linee guida C# async.FindAsync è lento, ma il caricamento lento è veloce

var activeTemplate = await exec.DbContext 
.FormTemplates.FindAsync(exec.Form.ActiveTemplateId); 

e funzionava lentamente, era lento nel profiler server SQL, il testo della query era veloce in SSMS. Ci sono voluti 5 secondi per recuperare questa linea.

L'alternativa:

var activeTemplate = exec.Form.ActiveTemplate; 

è molto più veloce. Il problema non sembra essere lo sniffing dei parametri, poiché il numero di letture nelle query veloci e lente è lo stesso.

Un punto potenzialmente irrilevante è che l'oggetto recuperato contiene una proprietà stringa contenente ~ 1 MB di testo. L'applicazione è asp.net mvc, in esecuzione sullo stesso computer del server SQL, che si collega usando (locale).

Qual è la causa della lentezza osservata?

EDIT: Dopo @ JBL commento, ho fatto alcuni altri esperimenti:

var activeTemplate = await exec.DbContext.FormTemplates 
.FirstOrDefaultAsync(x => x.Id == exec.Form.ActiveTemplateId); // slow 

var activeTemplate = exec.DbContext.FormTemplates 
.FirstOrDefault(x => x.Id == exec.Form.ActiveTemplateId); // fast 
+2

questo dovrebbe aiutare http://stackoverflow.com/a/11688189/1236044 – jbl

+0

Grazie, stranamente, Thies non è la risposta: si prega vedere la modifica – Alireza

+2

Vedere la risposta qui, potrebbe essere il tuo caso: http://stackoverflow.com/questions/28543293/entity-framework-async-operation-takes-ten-times-as-long-to-completo –

risposta

5

metodo asincrono può avere problema di prestazioni durante la lettura di un grande colonna dal server (ad esempio varbinary (MAX), varchar (MAX) , nvarchar (MAX) o XML).

Potete trovare rducom risposta che spiega il problema con metodo asincrono here

+2

Puoi votare per ottenere la correzione qui: https://entityframework.codeplex.com/workitem/2686 – Seb