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%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:
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.
Tags und Links c# async-await asynchronous c#-5.0