Как я могу запустить хранимую процедуру объекта в 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));
    }