Estoy intentando integrarme async/ awaiten nuestro bus de servicio. Implementé un SingleThreadSynchronizationContextbasado en este ejemplo http://blogs.msdn.com/b/pfxteam/archive/2012/01/20/10259049.aspx .
Y funciona bien, excepto por una cosa: TransactionScope. Espero cosas dentro del TransactionScopey se rompe el TransactionScope.
TransactionScopeno parece funcionar bien con async/ await, ciertamente porque almacena cosas en el hilo usando ThreadStaticAttribute. Obtengo esta excepción:
"TransactionScope anidado incorrectamente".
Intenté guardar TransactionScopedatos antes de poner en cola la tarea y restaurarla antes de ejecutarla, pero parece que no cambia nada. Y el TransactionScopecódigo es un desastre, por lo que es muy difícil entender qué está pasando allí.
¿Hay alguna forma de hacerlo funcionar? ¿Existe alguna alternativa a TransactionScope?

SingleThreadSynchronizationContextpara cada nivel superiorTransactionScope.Respuestas:
En .NET Framework 4.5.1, hay un conjunto de nuevos constructores
TransactionScopeque toman unTransactionScopeAsyncFlowOptionparámetro.Según MSDN, permite el flujo de transacciones a través de continuaciones de subprocesos.
Tengo entendido que está destinado a permitirle escribir código como este:
fuente
Un poco tarde para una respuesta, pero estaba teniendo el mismo problema con MVC4 y actualicé mi proyecto de 4.5 a 4.5.1 haciendo clic derecho en el proyecto para ir a propiedades. Seleccione la pestaña de la aplicación, cambie el marco de destino a 4.5.1 y use la transacción de la siguiente manera.
fuente
Puede utilizar DependentTransaction creado por el método Transaction.DependentClone () :
Gestión de la simultaneidad con DependentTransaction
http://adamprescott.net/2012/10/04/transactionscope-in-multi-threaded-applications/
fuente
await Task.Delay(500)este patrón, también fallaráTransactionScope nested incorrectlyporque el TransactionScope más externo (no mostrado en el ejemplo anterior) sale del alcance antes de que la tarea secundaria se complete correctamente. ReemplaceawaitconTask.Wait()y funciona, pero luego ha perdido los beneficios deasync.