Warum kann ich die asynchrone Abfrage nicht in die Methode verschieben?

8

Der folgende Code funktioniert

%Vor%

Wenn ich jedoch versuche, die asynchrone Methode wie folgt umzuformen,

%Vor%

Es schlägt fehl, mir den folgenden Fehler zu geben

  

Eine zweite Operation wurde in diesem Kontext vor einer vorherigen gestartet   asynchroner Vorgang abgeschlossen Verwenden Sie "erwarten", um sicherzustellen, dass alle   asynchrone Operationen wurden beendet, bevor eine andere Methode aufgerufen wurde   in diesem Zusammenhang. Es ist nicht garantiert, dass alle Instanzmitglieder Thread sind   sicher.

Warum ist das? Wie kann ich das schaffen?

Aktualisierung:

Db wird im Basiscontroller wie folgt deklariert

%Vor%

WebSiteDb erweitert DbContext wie folgt

%Vor%

Wenn ich in der Methode warte, wird der Fehler stattdessen aus der Methode geworfen

WithSlug () ist wie folgt

%Vor%     
Tom 21.02.2014, 16:12
quelle

3 Antworten

2

Versuchen Sie Ihren Code mit dem neuesten EF 6.1.0 Beta . Die aktuelle EF6-Definition der Thread-Sicherheit ist a etwas vage:

  

Fadensicherheit

     

Während Thread-Sicherheit async nützlicher machen würde, ist es orthogonal   Feature. Es ist unklar, ob wir jemals eine Unterstützung dafür einführen könnten   der allgemeinste Fall, wenn EF mit einem zusammengesetzten Graph interagiert   des Benutzercodes, um den Status beizubehalten, und es gibt keine einfachen Möglichkeiten, dies sicherzustellen   dass dieser Code auch threadsicher ist.

     

Im Moment erkennt EF, ob der Entwickler versucht, auszuführen   zwei asynchrone Operationen gleichzeitig und werfen.

Es sieht nicht so aus, als ob Ihr Code mehr als zwei asynchrone Operationen zur selben Zeit ausführt , aber in ASP.NET kann und wird ein Threadwechsel zwischen await fortfahren. Theoretisch sollte dieses Szenario weiterhin von EF6 unterstützt werden. Allerdings um die Möglichkeit eines EF6-Fehlers zu eliminieren, der durch die fehlende Thread-Affinität in ASP.NET verursacht wurde, könnten Sie versuchen, meine ThreadWithAffinityContext von die verwandte Frage , so:

%Vor%

Hinweis: Dies ist keine Produktionslösung , aber es könnte helfen, einen Fehler in EF6 zu finden. Wenn es einen Fehler gibt, sollten Sie eine andere Hilfsklasse, ThreadAffinityTaskScheduler <, verwenden / a>, bis der Fehler in den zukünftigen EF-Versionen behoben ist. ThreadAffinityTaskScheduler führt einen Pool von ThreadWithAffinityContext -Threads aus und sollte daher besser skalieren als der obige Code. Die verknüpfte Frage enthält ein Anwendungsbeispiel.

    
Noseratio 22.02.2014 00:41
quelle
0

Der folgende Testcode funktioniert einwandfrei. Zeigen Sie die Implementierung von .WithSlug( slug )

%Vor%     
Moho 21.02.2014 16:51
quelle
-2

Wenn Sie den async in der Funktion nicht finden, sollte es sein:

%Vor%

Ohne diese werden beide Aufrufe gleichzeitig in separaten Threads ausgeführt, was gleichzeitig zwei Treffer für den Kontext zur Folge hat.

    
Solmead 26.02.2015 20:12
quelle