J'essaie d'intégrer async
/ await
dans notre bus de service. J'ai implémenté un SingleThreadSynchronizationContext
sur la base de cet exemple http://blogs.msdn.com/b/pfxteam/archive/2012/01/20/10259049.aspx .
Et ça marche bien, sauf pour une chose : TransactionScope
. J'attends des trucs à l'intérieur du TransactionScope
et il casse le TransactionScope
.
TransactionScope
n'a pas l'air de bien jouer avec le async
/ await
certainement parce qu'il stocke les choses dans le fil en utilisant ThreadStaticAttribute
. Je reçois cette exception :
"TransactionScope nested incorrect.".
J'ai essayé de sauver TransactionScope
avant de mettre la tâche en file d'attente et de les restaurer avant de l'exécuter, mais cela ne semble rien changer. Et TransactionScope
Le code est désordonné, il est donc très difficile de comprendre ce qui se passe.
Y a-t-il un moyen de le faire fonctionner ? Existe-t-il une alternative à TransactionScope
?
0 votes
Voici un code très simple pour reproduire une erreur de TransactionScope pastebin.com/Eh1dxG4a sauf que l'exception ici est la Transaction Abortée
0 votes
Pouvez-vous simplement utiliser une transaction SQL ordinaire ? Ou bien vous utilisez plusieurs ressources ?
0 votes
Je couvre de multiples ressources
0 votes
Il semble que vous devrez soit passer la portée dans votre méthode asynchrone, soit lui donner un moyen de la récupérer à partir d'une sorte de contexte commun identifié avec votre unité de travail.
0 votes
Vous aurez besoin d'un fil séparé avec son propre
SingleThreadSynchronizationContext
pour chaque niveau supérieurTransactionScope
.0 votes
J'ai essayé de sauvegarder le contexte ThreadStatic Scope dans la méthode SynchronisationContext Post. Mais cette méthode est exécutée sur le même Thread que la méthode qui est postée. Donc maintenant je sauvegarde le contexte juste après avoir déclaré le TransactionScope et cela fonctionne. Bien sûr, j'accède au scope ContextData en utilisant la réflexion, et c'est très mauvais. Mais au moins, ça marche !