【发布时间】:2012-10-04 09:44:21
【问题描述】:
我正在尝试使用新的 async/await 功能来异步处理数据库。由于某些请求可能很长,我希望能够取消它们。我遇到的问题是TransactionScope 显然具有线程亲和性,并且似乎在取消任务时,它的Dispose() 在错误的线程上运行。
具体来说,当调用.TestTx() 时,我在task.Wait () 上得到以下AggregateException 包含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 ();
// ...
//}
}
}
}
更新:被注释掉的部分是为了表明一旦连接打开,就有一些事情要做——异步地——但是重现问题不需要该代码。
【问题讨论】:
标签: c# .net database transactions async-await