¿Cómo disponer TransactionScope en async / await cancelable?
Estoy tratando de usar la nueva función async / await para trabajar de forma asíncrona con una base de datos. Como algunas de las solicitudes pueden ser largas, quiero poder cancelarlas. El problema que estoy encontrando es queTransactionScope
Aparentemente tiene una afinidad de hilos, y parece que al cancelar la tarea, suDispose()
se ejecuta en un hilo equivocado.
Específicamente, al llamar.TestTx()
Me sale lo siguienteAggregateException
que contieneInvalidOperationException
entask.Wait ()
:
"A TransactionScope must be disposed on the same thread that it was created."
Aquí está el código:
public void TestTx () {
var cancellation = new CancellationTokenSource ();
var task = TestTxAsync ( cancellation.Token );
cancellation.Cancel ();
task.Wait ();
}
private async Task TestTxAsync ( CancellationToken cancellationToken ) {
using ( var scope = new TransactionScope () ) {
using ( var connection = new SqlConnection ( m_ConnectionString ) ) {
await connection.OpenAsync ( cancellationToken );
//using ( var command = new SqlCommand ( ... , connection ) ) {
// await command.ExecuteReaderAsync ();
// ...
//}
}
}
}
ACTUALIZADO: la parte comentada es mostrar que hay algo que hacer, de forma asíncrona, con la conexión una vez que esté abierta, pero ese código no es necesario para reproducir el problema.