Как я могу запустить хранимую процедуру объекта в async EF6 и не ждать возврата?
Я хотел бы просто приложить вызов к SQL Server и не дожидаться возврата. У меня есть импортированная функция Entity из хранимой процедуры, которую я бы назвал асинхронным вызовом в Entity Framework 6.0.0-rc1. Это возможно? Какой синтаксис?
Entity Function: RecalculateBudgetNumbers(int id)
Ответы
Ответ 1
Запустите новый Task
, который создает новый контекст данных и вызывает эту функцию. Просто не ждите/не ждите эту задачу. Пусть он запускается сам по себе.
Обязательно регистрируйте ошибки. Не проглатывайте исключения, потому что они могут быть ошибками, о которых вы хотите знать.
В настройке ASP.NET имейте в виду, что рабочий процесс может в любой момент переработать, поэтому ваши фоновые работы могут внезапно исчезнуть (или будут отменены).
Ответ 2
Ааа. Я слишком долго находился в Entity Framework. Спасибо за советы. Вот что сработало для меня. Вы видите какие-либо проблемы с этим?
/// <summary>
/// kicks off the LONG RUNNING calculations on a budget to regenerate all pre-cooked numbers.
/// </summary>
/// <param name="budgetId">Budget Id</param>
public async System.Threading.Tasks.Task RecalculateBudgetNumbersAsync(int budgetId)
{
await System.Threading.Tasks.Task.Factory.StartNew(() => RecalculateBudgetNumbers(budgetId));
}
public static void RecalculateBudgetNumbers(int budgetId)
{
//this is static so we don't use the unit of work..
using (BMTContext ctx = new BMTContext())
{
ctx.UpdateLifeOfBudgetNumbers(budgetId);
ctx.UpdateIntervalNumbers(budgetId);
ctx.UpdateIntervalActivityNumbers(budgetId);
ctx.UpdateLifeOfBudgetActivityNumbers(budgetId);
}
}
И мой тест (я в Visual Studio 2012, поэтому я могу выполнить асинхронный тест).
[TestMethod]
public async System.Threading.Tasks.Task RecalculateBudgetNumbersAsyncTest()
{
System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();
timer.Start();
await repo.RecalculateBudgetNumbersAsync(budgetId);
System.Console.WriteLine("RecalculateBudgetNumbersAsyncTest milliseconds: " + timer.ElapsedMilliseconds.ToString());
}
После предложений от Matt Smith и Usr я изменил RecalculateBudgetNumbersAsync
на это. Надеюсь, это то, что они имели в виду:
public void RecalculateBudgetNumbersAsync(int budgetId)
{
System.Threading.Tasks.Task.Factory.StartNew(() => RecalculateBudgetNumbers(budgetId));
}