如何让TransactionScope使用异步/等待?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (39)

我试图整合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();
}

扫码关注云+社区