我正在尝试使用新的异步/等待特性来异步处理数据库。由于有些请求可能很长,我希望能够取消它们。我遇到的问题是,TransactionScope
显然具有线程亲和性,而且似乎在取消任务时,它的 Dispose()
在错误的线程上运行。
具体来说,当调用 .TestTx()
时,我会得到以下 AggregateException
,其中包含 task.Wait ()
上的 InvalidOperationException
:
"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 ();
// ...
//}
}
}
}
UPDATE: 注释掉的部分是为了显示在连接打开时有一些事情需要做ーー异步ーー但是不需要这些代码来重现问题。