Obtenez TransactionScope pour travailler avec async / wait

J’essaie d’intégrer l’ async / await dans notre bus de service. J’ai implémenté un SingleThreadSynchronizationContext basé sur cet exemple http://blogs.msdn.com/b/pfxteam/archive/2012/01/20/10259049.aspx .

Et ça marche bien, sauf une chose: TransactionScope . J’attends des trucs à l’intérieur du TransactionScope et ça casse le TransactionScope .

TransactionScope ne semble pas bien fonctionner avec l’ async / await , certainement parce qu’il stocke des choses dans le thread en utilisant ThreadStaticAtsortingbute . Je reçois cette exception:

“TransactionScope nested incorrectement.”

J’ai essayé de sauvegarder les données TransactionScope avant de mettre la tâche en queue et de la restaurer avant de l’exécuter, mais cela ne semble pas changer quelque chose. Et le code TransactionScope est un gâchis, il est donc très difficile de comprendre ce qui se passe là-bas.

Y a-t-il un moyen de le faire fonctionner? Y a-t-il une alternative à TransactionScope ?

    Dans .NET Framework 4.5.1, il existe un ensemble de nouveaux constructeurs pour TransactionScope qui utilisent un paramètre TransactionScopeAsyncFlowOption .

    Selon MSDN, cela permet un stream de transactions entre les suites de threads.

    Ma compréhension est que cela est destiné à vous permettre d’écrire du code comme celui-ci:

     // transaction scope using (var scope = new TransactionScope(... , TransactionScopeAsyncFlowOption.Enabled)) { // connection using (var connection = new SqlConnection(_connectionSsortingng)) { // open connection asynchronously await connection.OpenAsync(); using (var command = connection.CreateCommand()) { command.CommandText = ...; // run command asynchronously using (var dataReader = await command.ExecuteReaderAsync()) { while (dataReader.Read()) { ... } } } } scope.Complete(); } 

    Un peu tard pour une réponse mais j’avais le même problème avec MVC4 et j’ai mis à jour mon projet de 4.5 à 4.5.1 en faisant un clic droit sur le projet aller dans les propriétés. Sélectionnez l’onglet de l’application pour modifier le framework cible à 4.5.1 et utilisez la transaction comme suit.

     using (AccountServiceClient client = new AccountServiceClient()) using (TransactionScope scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) { } 

    Vous pouvez utiliser DependentTransaction créé par la méthode Transaction.DependentClone () :

     static void Main(ssortingng[] args) { // ... for (int i = 0; i < 10; i++) { var dtx = Transaction.Current.DependentClone( DependentCloneOption.BlockCommitUntilComplete); tasks[i] = TestStuff(dtx); } //... } static async Task TestStuff(DependentTransaction dtx) { using (var ts = new TransactionScope(dtx)) { // do transactional stuff ts.Complete(); } dtx.Complete(); } 

    Gestion de la concurrence avec la transaction dépendante

    http://adamprescott.net/2012/10/04/transactionscope-in-multi-threaded-applications/