Как разместить TransactionScope в отменяемой асинхронной / ожидающей?

Я пытаюсь использовать новую функцию async / await для асинхронной работы с БД. Поскольку некоторые запросы могут быть длительными, я хочу иметь возможность отменить их. Проблема, с которой я сталкиваюсь, заключается в том, чтоTransactionScope очевидно, имеет сродство потока, и кажется, что при отмене задачи ееDispose() работает на неправильной нити.

Именно при звонке.TestTx() Я получаю следующееAggregateException содержащийInvalidOperationException наtask.Wait ():

"A TransactionScope must be disposed on the same thread that it was created."

Вот код:

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 ();
            //  ...
            //}
        }
    }
}

ОБНОВЛЕНО: закомментированная часть должна показать, что нужно что-то сделать & # x2014; асинхронно & # x2014; с соединением, как только оно открыто, но этот код не требуется для воспроизведения проблемы.

Ответы на вопрос(4)

Ваш ответ на вопрос