Estoy intentando integrarme async
/ await
en nuestro bus de servicio. Implementé un SingleThreadSynchronizationContext
basado 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 TransactionScope
y se rompe el TransactionScope
.
TransactionScope
no parece funcionar bien con async
/ await
, ciertamente porque almacena cosas en el hilo usando ThreadStaticAttribute
. Obtengo esta excepción:
"TransactionScope anidado incorrectamente".
Intenté guardar TransactionScope
datos antes de poner en cola la tarea y restaurarla antes de ejecutarla, pero parece que no cambia nada. Y el TransactionScope
có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
?
SingleThreadSynchronizationContext
para cada nivel superiorTransactionScope
.Respuestas:
En .NET Framework 4.5.1, hay un conjunto de nuevos constructores
TransactionScope
que toman unTransactionScopeAsyncFlowOption
pará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 incorrectly
porque el TransactionScope más externo (no mostrado en el ejemplo anterior) sale del alcance antes de que la tarea secundaria se complete correctamente. Reemplaceawait
conTask.Wait()
y funciona, pero luego ha perdido los beneficios deasync
.