我编写了一个以异步方式执行数据库操作的程序。我尝试使用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();
}
}
已编辑:包含方法标题/签名。
答案 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