Асинхронно выполнять транзакции базы данных в.NET 4.5.1
Я написал программу для выполнения операций с базой данных в асинхронном режиме. Я пытаюсь запустить его в транзакции базы данных, используя BeginTransaction() или TransactionScope, но безуспешно. Я прошел по коду в VS2012 и заметил, что выполнение выпрыгнет из цикла foreach, когда он увидит ожидание для ExecuteNonQueryAsync.
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 ответ
Спасибо Джон! Вы правильно поняли!!
Я забыл использовать await или.Wait() в вызывающей программе. Я был так сосредоточен на проблеме асинхронной поддержки транзакций до.NET 4.5.1
await MyFunction();
или же
MyFunction().Wait();
Кстати, необходимо установить пакет разработчика.NET 4.5.1 (KB2878632), чтобы можно было изменить цель проекта с.NET Framework 4.0 на 4.5.1.