没有Task.Run()的并行化

时间:2018-07-20 09:22:50

标签: c# multithreading entity-framework async-await

是否可以让某些内容在后台运行(例如,数据库查询)而无需使用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
}

2 个答案:

答案 0 :(得分:1)

await关键字将暂停被调用方法内的执行,并将执行返回给调用该方法的方法。因此,如果您想尽早从“来电者”返回,只需离开

await runningQuery;

就位。

此Microsoft Page对此进行了解释。如果您在标题What Happens in an Async Method下查看该图,则可以很好地看到逻辑流程。

答案 1 :(得分:1)

您可以完全做到这一点。查询SaveChangesAsync返回后即开始运行。 await暂停执行直到任务完成。因此,请勿使用await(您已正确执行此操作)。

请注意,解雇工作非常困难。您需要确保记录错误。另外,您通常不能依靠工作来完成。可能存在错误(例如网络故障,死锁或超时),或者整个过程可能在查询完成之前退出。这在ASP.NET中尤其重要。如果您不想在任何时候等待火灾,请考虑开火并忘记选择工作。