在.NET 4.5.1中异步执行事务数据库操作

时间:2014-02-28 07:24:00

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

我编写了一个以异步方式执行数据库操作的程序。我尝试使用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();
    }
}

已编辑:包含方法标题/签名。

1 个答案:

答案 0 :(得分:0)

谢谢约翰!你做对了!!

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

await MyFunction();

MyFunction().Wait();

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