TransactionScope是否在没有原始上下文的情况下跨异步延续流动?

时间:2015-07-25 18:09:50

标签: asp.net-mvc asynchronous transactionscope

我正在开发一个ASP.NET MVC5应用程序,我遇到以下情况:

  1. 异步控制器方法调用自定义异步方法1次以上,每个Task对象连续存储在List中
  2. 每个自定义异步方法调用都使用TransactionScopeAsyncFlow.Enabled建立自己的顶级TransactionScope
  3. 每个自定义异步方法调用执行事务性工作,然后等待DbContext.SaveChangesAsync()
  4. 当发生这种情况时,控制器方法在其自己的无关TransactionScope中执行自己的事务工作,然后等待Task.WhenAll()
  5. 问题来自于在等待DbContext.SaveChangesAsync()时使用ConfigureAwait(false)。每次调用自定义异步方法都是从控制器方法的ASP.NET请求上下文开始的,但是当SaveChangesAsync()返回EXCEPT时,如果它会弄乱当前事务,我认为没有必要重新捕获它。这很重要,因为如果在等待Task.WhenAll之前控制器方法中发生不可恢复的异常,我需要取消catch块中的异步任务,这意味着不是等待Task.WhenAll()我被迫使用阻塞方法Task.WaitAll(),如果异步任务试图重新捕获原始请求上下文,我非常肯定会死锁。

    很抱歉,这是一个重复的问题。我做了很多搜索,无法得到明确的答案。随意告诉我这是糟糕的编程或其他什么,至少建议一个替代方案,让我的妈妈离开它。谢谢!

0 个答案:

没有答案