2

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

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

4

1 回答 1

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

于 2014-02-28T18:12:42.553 回答