Como descartar TransactionScope em async / wait cancelável?
Estou tentando usar o novo recurso async / await para trabalhar de forma assíncrona com um banco de dados. Como algumas das solicitações podem ser demoradas, quero poder cancelá-las. A questão que estou correndo é queTransactionScope
aparentemente tem uma afinidade de thread, e parece que ao cancelar a tarefa, suaDispose()
é executado em um segmento errado.
Especificamente, ao chamar.TestTx()
Eu recebo o seguinteAggregateException
contendoInvalidOperationException
emtask.Wait ()
:
"A TransactionScope must be disposed on the same thread that it was created."
Aqui está o 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 ();
// ...
//}
}
}
}
ATUALIZADO: a parte comentada é mostrar que há algo a ser feito - de forma assíncrona - com a conexão, uma vez aberta, mas esse código não é necessário para reproduzir o problema.