是否可以让某些内容在后台运行(例如,数据库查询)而无需使用Task.Run()产生新线程?
示例Db查询
public async Task Query(long objectToDelete)
{
using ( var ctx= new Context())
{
Car car = new Car { Id = objectToDelete};
ctx.Entry(employer).State = EntityState.Deleted;
await ctx.SaveChangesAsync();
}
}
据我所知,查询是同步运行的,直到第一个“等待”,然后控件才返回给调用者,
我想知道我是否可以留下这样的呼叫者:
public async Task Caller( long id)
{
var runningQuery = Query( id);
/* do something else
*/
// await runningQuery; // commented out so "Caller" can complete early
}
答案 0 :(得分:1)
await关键字将暂停被调用方法内的执行,并将执行返回给调用该方法的方法。因此,如果您想尽早从“来电者”返回,只需离开
await runningQuery;
就位。
此Microsoft Page对此进行了解释。如果您在标题What Happens in an Async Method下查看该图,则可以很好地看到逻辑流程。
答案 1 :(得分:1)
您可以完全做到这一点。查询SaveChangesAsync
返回后即开始运行。 await
暂停执行直到任务完成。因此,请勿使用await(您已正确执行此操作)。
请注意,解雇工作非常困难。您需要确保记录错误。另外,您通常不能依靠工作来完成。可能存在错误(例如网络故障,死锁或超时),或者整个过程可能在查询完成之前退出。这在ASP.NET中尤其重要。如果您不想在任何时候等待火灾,请考虑开火并忘记选择工作。