Ich versuche async
/ await
in unseren Servicebus zu integrieren . Ich habe ein SingleThreadSynchronizationContext
auf diesem Beispiel basierendes http://blogs.msdn.com/b/pfxteam/archive/2012/01/20/10259049.aspx implementiert .
Und es funktioniert gut, bis auf eine Sache : TransactionScope
. Ich warte auf Sachen in der TransactionScope
und es bricht die TransactionScope
.
TransactionScope
scheint nicht gut mit dem async
/ zu spielen await
, sicherlich weil es Dinge im Thread mit speichert ThreadStaticAttribute
. Ich bekomme diese Ausnahme:
"TransactionScope ist falsch verschachtelt."
Ich habe versucht, TransactionScope
Daten vor dem Einreihen in die Warteschlange zu speichern und vor dem Ausführen wiederherzustellen, aber es scheint nichts zu ändern. Und TransactionScope
Code ist ein Chaos, daher ist es wirklich schwer zu verstehen, was dort vor sich geht.
Gibt es eine Möglichkeit, es zum Laufen zu bringen? Gibt es eine Alternative zu TransactionScope
?
SingleThreadSynchronizationContext
für jede oberste Ebene einen eigenen ThreadTransactionScope
.Antworten:
In .NET Framework 4.5.1 gibt es eine Reihe neuer Konstruktoren für
TransactionScope
diesenTransactionScopeAsyncFlowOption
Parameter.Laut MSDN ermöglicht es den Transaktionsfluss über Thread-Fortsetzungen.
Mein Verständnis ist, dass es Ihnen ermöglichen soll, Code wie folgt zu schreiben:
quelle
Etwas spät für eine Antwort, aber ich hatte das gleiche Problem mit MVC4 und habe mein Projekt von 4.5 auf 4.5.1 aktualisiert, indem ich mit der rechten Maustaste auf Projekt geklickt habe. Gehe zu Eigenschaften. Wählen Sie die Registerkarte Anwendung, ändern Sie das Zielframework auf 4.5.1 und verwenden Sie die Transaktion wie folgt.
quelle
Sie können DependentTransaction verwenden, das mit der Transaction.DependentClone () -Methode erstellt wurde:
Verwalten der Parallelität mit DependentTransaction
http://adamprescott.net/2012/10/04/transactionscope-in-multi-threaded-applications/
quelle
await Task.Delay(500)
dieses Muster ersetzen, schlägt dies ebenfalls fehl,TransactionScope nested incorrectly
da das äußerste TransactionScope (im obigen Beispiel nicht gezeigt) den Gültigkeitsbereich verlässt, bevor die untergeordnete Aufgabe ordnungsgemäß abgeschlossen wird. Ersetzenawait
durchTask.Wait()
und es funktioniert, aber dann haben Sie die Vorteile von verlorenasync
.