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.

questionAnswers(4)

yourAnswerToTheQuestion