Как разместить 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; с соединением, как только оно открыто, но этот код не требуется для воспроизведения проблемы.