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