Я пытаюсь использовать новую функцию 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 ();
// ...
//}
}
}
}
ОБНОВЛЕНО: закомментированная часть - показать, что что-то будет сделано - асинхронно - с соединением после его открытия, но этот код не требуется для воспроизведения проблемы.