C# 如何在EF6 async中启动实体存储过程而不等待返回?
我只想将一个调用转移到SQL Server,而不是等待返回。我有一个从存储过程导入的实体函数,我希望在EntityFramework6.0.0-rc1中以这种方式异步调用该函数。这可能吗?语法是什么C# 如何在EF6 async中启动实体存储过程而不等待返回?,c#,entity-framework,visual-studio-2012,.net-4.5,async-await,C#,Entity Framework,Visual Studio 2012,.net 4.5,Async Await,我只想将一个调用转移到SQL Server,而不是等待返回。我有一个从存储过程导入的实体函数,我希望在EntityFramework6.0.0-rc1中以这种方式异步调用该函数。这可能吗?语法是什么 Entity Function: RecalculateBudgetNumbers(int id) 启动一个新的任务,该任务创建一个新的数据上下文并调用该函数。不要等待那项任务。让它自己完成 确保记录错误。不要接受异常,因为它们可能是您想要了解的bug 在ASP.NET设置中,请注意工作进程可以随
Entity Function: RecalculateBudgetNumbers(int id)
启动一个新的
任务
,该任务创建一个新的数据上下文并调用该函数。不要等待那项任务。让它自己完成
确保记录错误。不要接受异常,因为它们可能是您想要了解的bug
在ASP.NET设置中,请注意工作进程可以随时循环,因此您的后台工作可能会突然消失(或被取消)。啊哈。我在这片土地上呆得太久了。谢谢你的提示。这是对我有用的东西。你觉得这有什么问题吗
/// <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);
}
}
根据Matt Smith和Usr的建议,我将RecreacteBudgetNumbersAsync
更改为此。我希望这就是他们的意思:
public void RecalculateBudgetNumbersAsync(int budgetId)
{
System.Threading.Tasks.Task.Factory.StartNew(() => RecalculateBudgetNumbers(budgetId));
}
不要停留在实体框架上!您可以使用这些异步方法,就像您可以使用其他异步方法一样。(Task.Run,Thread,async(从4.5开始))不需要
async
/wait
中的关键字重新计算预算数字同步
。删除它们,您将拥有同等的功能。一个问题-释放主线程并启动新线程不会降低性能吗!?生成新线程,然后在新线程完成后在主线程上恢复,这似乎会带来开销。是吗?我加了一些代码。当我尝试在RecalculateBudgetNumbersAsync中删除Wait时,VS会给我一个警告:因为此调用未被等待,所以当前方法的执行将在调用完成之前继续。考虑将“等待”操作符应用到调用的结果。我如何让它自己跑出来而不等待返回?@usr花了很多时间试图让我的示例使用不同的测试。我的异步需要包括使用dbcontext保存。您关于使用新数据上下文的评论帮助很大。谢谢
public void RecalculateBudgetNumbersAsync(int budgetId)
{
System.Threading.Tasks.Task.Factory.StartNew(() => RecalculateBudgetNumbers(budgetId));
}