Jak usunąć TransactionScope w asynchronicznym anulowaniu / oczekiwaniu?
Próbuję użyć nowej funkcji async / await do asynchronicznej pracy z bazą danych. Ponieważ niektóre wnioski mogą być długie, chcę móc je anulować. Problem, w którym się znajduję, jest takiTransactionScope
najwyraźniej ma powinowactwo do wątku i wydaje się, że podczas anulowania zadania, jegoDispose()
dostaje się w niewłaściwym wątku.
Szczególnie, gdy dzwonisz.TestTx()
Dostaję następująceAggregateException
zawierającyInvalidOperationException
natask.Wait ()
:
"A TransactionScope must be disposed on the same thread that it was created."
Oto kod:
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 ();
// ...
//}
}
}
}
AKTUALIZACJA: skomentowana część ma pokazać, że coś jest do zrobienia - asynchronicznie - z połączeniem po jego otwarciu, ale kod ten nie jest wymagany do odtworzenia problemu.