我正在尝试使用新的 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 ();
// ...
//}
}
}
}
更新:注释掉的部分是为了表明有一些事情要做 - 异步 - 一旦连接打开,但不需要该代码来重现问题。