【问题标题】:Perform transactional database operations asynchronously in .NET 4.5.1在 .NET 4.5.1 中异步执行事务数据库操作
【发布时间】:2014-04-01 01:57:16
【问题描述】:

我编写了一个程序以异步方式执行数据库操作。我尝试使用 BeginTransaction() 或 TransactionScope 在数据库事务中运行它,但没有运气。我单步执行了 VS2012 中的代码,并注意到当它看到等待 ExecuteNonQueryAsync 时,执行会跳出 foreach 循环。

public delegate void CallBackMethod();

public async Task MyFunction(List<string> items, CallBackMethod functionToCallBeforeCommitTransaction)
{   
    using (TransactionScope trans = new TransactionScope(
                                               TransactionScopeOption.RequiresNew, 
                                               TransactionScopeAsyncFlowOption.Enabled ))
    {
        using (SqlConnection conn = new SqlConnection(myConnectionString))
        {
            await conn.OpenAsync();
            foreach (string item in items)
            {
                SqlCommand cmd = new SqlCommand("MySproc", conn);
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@ItemID", item);
                await cmd.ExecuteNonQueryAsync();  
                // ^^^ Execution jumps out here and returns back to the calling function. 
                //     No exception was raised.  It did not continue the loop.
            }
        }
        functionToCallBeforeCommitTransaction();
        trans.Complete();
    }
}

已编辑:包括方法标头/签名。

【问题讨论】:

  • 你能显示方法签名吗...
  • 你是怎么打电话给MyFunction的?你await了吗?
  • 你看到了什么行为?例外?死锁?

标签: c# sql async-await transactional-database


【解决方案1】:

谢谢约翰!你没看错!!

我忘记在调用者中使用 await 或 .Wait()。在 .NET 4.5.1 之前,我非常关注事务的异步支持问题

await MyFunction();

MyFunction().Wait();

顺便说一句,.NET 4.5.1 Developer Pack (KB2878632) 需要安装,以便您可以将项目目标从 .NET Framework 4.0 更改为 4.5.1

【讨论】:

  • 根据您的环境(您的阻塞函数在单个线程上运行,SyncroizationContext 将封送它的调用)执行MyFunction().Wait() 将导致您的代码死锁。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-15
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
  • 2021-11-28
  • 2017-06-23
  • 2011-11-02
相关资源
最近更新 更多