内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用
我试图整合async
/ await
到我们的服务总线。我SingleThreadSynchronizationContext
基于此示例实现了一个http://blogs.msdn.com/b/pfxteam/archive/2012/01/20/10259049.aspx。
除了一件事外,它工作得很好:TransactionScope
。我等待内部的东西TransactionScope
,它打破了TransactionScope
。
TransactionScope
似乎并不能很好地处理async
/ await
,当然是因为它将事情存储在线程中ThreadStaticAttribute
。我得到这个例外:
“TransactionScope嵌套错误。”
我试图TransactionScope
在排队任务之前保存数据并在运行之前将其恢复,但似乎并未改变任何事情。而且TransactionScope
代码很混乱,所以很难理解那里正在发生的事情。
有没有办法让它工作?有一些替代TransactionScope
方法吗?
要得到答案有点晚了,但是MVS 4也有同样的问题,我通过右键单击“项目转到属性”将我的项目从4.5更新到4.5.1。选择应用程序选项卡,将目标框架更改为4.5.1,并按如下方式使用事务。
using (AccountServiceClient client = new AccountServiceClient()) using (TransactionScope scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) { }
在.NET Framework 4.5.1中,有一组用于TransactionScope的新构造函数,它们具有TransactionScopeAsyncFlowOption参数。
根据MSDN,它支持跨线程延续的事务流。
我的理解是,它意味着你可以编写这样的代码:
// transaction scope
using (var scope = new TransactionScope(... ,
TransactionScopeAsyncFlowOption.Enabled))
{
// connection
using (var connection = new SqlConnection(_connectionString))
{
// open connection asynchronously
await connection.OpenAsync();
using (var command = connection.CreateCommand())
{
command.CommandText = ...;
// run command asynchronously
using (var dataReader = await command.ExecuteReaderAsync())
{
while (dataReader.Read())
{
...
}
}
}
}
scope.Complete();
}