首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >让TransactionScope与异步/等待一起工作

让TransactionScope与异步/等待一起工作
EN

Stack Overflow用户
提问于 2012-11-25 00:47:09
回答 4查看 32.9K关注 0票数 126

我正在尝试将async/await集成到我们的服务总线中。我基于这个示例http://blogs.msdn.com/b/pfxteam/archive/2012/01/20/10259049.aspx实现了一个SingleThreadSynchronizationContext

它工作得很好,除了一件事:TransactionScope。我在等待TransactionScope中的东西,它破坏了TransactionScope

TransactionScope似乎不能很好地处理async/await,当然是因为它使用ThreadStaticAttribute在线程中存储内容。我得到了这个例外:

"TransactionScope嵌套不正确。“。

我尝试在将任务排队之前保存TransactionScope数据,并在运行任务之前恢复它,但似乎没有任何改变。而且TransactionScope代码一团糟,所以真的很难理解那里发生了什么。

有没有办法让它工作呢?是否有TransactionScope的替代方案

EN

回答 4

Stack Overflow用户

发布于 2013-07-08 21:21:43

在.NET框架4.5.1中,有一组接受TransactionScopeAsyncFlowOption参数new constructors for TransactionScope

根据MSDN的说法,它支持跨线程延续的事务流。

我的理解是,它的目的是让你可以像这样写代码:

代码语言:javascript
复制
// 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();
}
票数 178
EN

Stack Overflow用户

发布于 2014-05-04 10:26:08

回答有点晚了,但我在MVC4上遇到了同样的问题,我通过右键单击项目转到属性,将我的项目从4.5更新到4.5.1。选择application tab,将target framework更改为4.5.1,并使用transaction,如下所示。

代码语言:javascript
复制
using (AccountServiceClient client = new AccountServiceClient())
using (TransactionScope scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
}
票数 13
EN

Stack Overflow用户

发布于 2012-12-26 08:16:02

您可以使用Transaction.DependentClone()方法创建的DependentTransaction

代码语言:javascript
复制
static void Main(string[] args)
{
  // ...

  for (int i = 0; i < 10; i++)
  {

    var dtx = Transaction.Current.DependentClone(
        DependentCloneOption.BlockCommitUntilComplete);

    tasks[i] = TestStuff(dtx);
  }

  //...
}


static async Task TestStuff(DependentTransaction dtx)
{
    using (var ts = new TransactionScope(dtx))
    {
        // do transactional stuff

        ts.Complete();
    }
    dtx.Complete();
}

Managing Concurrency with DependentTransaction

http://adamprescott.net/2012/10/04/transactionscope-in-multi-threaded-applications/

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13543254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档