2013-12-17 7 views
69

Dies ist:Multi-Async in Entity Framework 6? mein Code

var banner = context.Banners.ToListAsync() 
var newsGroup = context.NewsGroups.ToListAsync() 
await Task.WhenAll(banner, newsGroup); 

Aber wenn ich die Funktion von Controller aufgerufen. Es zeigte einen Fehler

Eine zweite Operation wurde in diesem Kontext gestartet, bevor eine vorherige asynchrone Operation abgeschlossen wurde. Verwenden Sie 'abwarten', um sicherzustellen, dass alle asynchronen Vorgänge abgeschlossen sind, bevor Sie eine andere Methode in diesem Kontext aufrufen. Es ist nicht garantiert, dass alle Instanzmitglieder Thread-sicher sind.

Bitte helfen Sie mir, dieses Problem zu lösen.

+6

Die Ausnahme ist kristallklar, was fragen Sie? –

+0

Ich habe 2 Aufgaben. Wenn ich jede Aufgabe ausführe. es ist Erfolg. aber wenn ich wie mein Code oben laufe. Es ist Fehler –

Antwort

91

Die Ausnahme erklärt deutlich, dass pro Kontext nur eine asynchrone Operation gleichzeitig zulässig ist.

So, du hast entweder zu await sie ein zu einer Zeit, wenn die Fehlermeldung schon sagt:

var banner = await context.Banners.ToListAsync(); 
var newsGroup = await context.NewsGroups.ToListAsync(); 

Oder können Sie mehrere Kontexte verwenden:

var banner = context1.Banners.ToListAsync(); 
var newsGroup = context2.NewsGroups.ToListAsync(); 
await Task.WhenAll(banner, newsGroup); 
+0

es ist Arbeit. Vielen Dank. –

+25

nur eine Anmerkung, wenn Sie eine Lazy-Variable haben, die den Kontext in der Abfrage verwendet, sogar mit der erwarten, wird es den gleichen Fehler werfen, nur die Eigenschaft vor der Abfrage, es war ein Schmerz, dies herauszufinden. –

+7

@ Pedro.The.Kid: Verwenden Sie in der Regel kein Lazy-Laden mit asynchronem DB-Zugriff. Lazy Loading ist immer synchron, daher ist es viel besser, Include oder separate Abfragen für die zusätzlichen Daten zu verwenden. –

1

Wenn Sie mit Unity für Dependency Injection verwenden für Musterbeispiel Repository Sie folgende Fehler unter Verwendung von zwei oder mehreren Kontexten mit create/update/delete erhalten:

Die Beziehung zwischen den beiden Objekten kann nicht definiert werden, da sie an verschiedene ObjectContext-Objekte gebunden sind.

Dies kann mit PerRequestLifetimeManager gelöst werden. Mehr Infos hier:

C# EF6 make multiple async calls to one context using Unity - Asp.Net Web Api

container.RegisterType<DbContext>(new PerRequestLifetimeManager()); 
container.RegisterType<ISupplierRepository, SupplierRepository>(); 
container.RegisterType<IContactRepository, ContactRepository>(); 
Verwandte Themen