如何启动EF6异步中的实体存储过程而不等待返回?

dir*_*irq 14 c# entity-framework async-await .net-4.5 visual-studio-2012

我想直接调用SQL Server而不是等待返回.我有一个存储过程中的导入实体函数,我想在Entity Framework 6.0.0-rc1中以这种方式异步调用.这可能吗?语法是什么?

Entity Function: RecalculateBudgetNumbers(int id)
Run Code Online (Sandbox Code Playgroud)

usr*_*usr 8

启动一个新的Task,创建一个新的数据上下文并调用该函数.只是不要等待/等待该任务.让它自己运行完成.

确保记录错误.不要吞下异常,因为它们可能是您想要了解的错误.

在ASP.NET设置中,请注意工作进程可以随时回收,因此您的后台工作可能会突然消失(或被取消).


dir*_*irq 5

啊。我在实体框架领域呆得太久了。感谢您的提示。这对我有用。您认为这有什么问题吗?

    /// <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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

还有我的测试(我在 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());
    }
Run Code Online (Sandbox Code Playgroud)

经过 Matt Smith 和 Usr 的建议,我改成RecalculateBudgetNumbersAsync了这个。我希望这就是他们的意思:

    public void RecalculateBudgetNumbersAsync(int budgetId)
    {
        System.Threading.Tasks.Task.Factory.StartNew(() => RecalculateBudgetNumbers(budgetId));
    }
Run Code Online (Sandbox Code Playgroud)