2014-07-11 16 views
40

Cosa succede quando si avviano più query Entity Framework asincrone e eseguono in parallelo?Entity Framework supporta query asincrone parallele?

Sono eseguiti fisicamente in parallelo? Sono serializzati da Entity Framework? Questo non è supportato? Risulterà in un'eccezione?

public async Task QueryDatabase() 
{ 
    using (var context = new MyDbContext()) 
    { 
     Task task1 = context.SomeTable1.ToListAsync(); 
     Task task2 = context.SomeTable2.ToListAsync(); 

     await Task.WhenAll(task1, task2); 
    } 
} 

risposta

50

Questo non è supportato come per il specifications of version 6.

Questo dovrebbe un'eccezione DbConcurrencyException dicendo

Una seconda operazione ha iniziato in questo contesto, prima di un precedente operazione asincrona completata. Utilizzare 'attendi' per assicurarsi che tutte le operazioni asincrone siano state completate prima di chiamare un altro metodo in questo contesto. Non è garantito che i membri di istanza siano protetti da thread .

EF rilevare se lo sviluppatore tenta di eseguire due operazioni asincrone in una sola volta e gettare .

Da a codeplex page of the project:

Abilitazione esecuzione asincrona delle operazioni di database è effettivamente ortogonale per consentire l'esecuzione contemporanea sullo stesso contesto. In il caso particolare di scenari server, utilizzando l'accesso simultaneo, potrebbe influire negativamente sulla scalabilità dello in quanto significherebbe che per elaborare una singola richiesta per il numero , ruotare un numero arbitrario di thread diversi. Tutti i thread competerebbero per risorse quali come memoria con altri thread necessari per il server altre richieste simultanee .

+3

Upvote per la precisione, anche se vorrei poter downvotare il tizio che ha scritto il frammento di Codeplex. Una buona query è quasi del tutto dannosa per il db, che nella maggior parte dei casi è multi-CPU e in molti casi in rete. Lanciare un gruppo di chiamate asincrone parallele al db usa NESSUN thread! http://blog.stephencleary.com/2013/11/there-is-no-thread.html Dovrebbe essere banale per EF supportare questo se tutte le query sono .AsNoTracking(), ma questa eccezione viene comunque generata. –

+0

@ChrisMoschini Sono sicuro che l'ultima frase non è riferita a EF ma a SQL Server. –

+0

@ErikPhilips Non sei sicuro di cosa intendi, puoi chiarire? –

2

Solo una nota, come menzionato da ken2k, non è consentita quando si utilizza Entity Framework con MS SQL Server. Tuttavia, se si utilizza Entity Framework con Oracle, questo è consentito.

+3

Puoi fornire una fonte per questo? La mia impressione è che EF internamente non sia in grado di eseguire più query contemporaneamente.Ciò richiederebbe che le sue strutture interne come la mappa delle identità fossero thread-safe. – usr

+2

Non posso dare una fonte, tutto quello che posso dire è che ho un codice in esecuzione in produzione che usa quel metodo. – jkruer01

+2

Incrocio di dita il tuo cercapersone non si spegnerà di notte. Grazie per aver segnalato questo. – usr