Асинхронно выполнять транзакции базы данных в.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.

Другие вопросы по тегам