使用Entity Framework异步删除行

Joe*_*ill 3 c# linq entity-framework async-await

我仍然是异步的新手,所以我不确定我所做的是否是多余的.以下从数据库中删除一行:

public static async Task Remove(int id)
{
    using (var ctx = new StoreContext())
    {
        ctx.Products.Remove(await ctx.Products.SingleOrDefaultAsync(x => x.ID == id));
        await ctx.SaveChangesAsync();
    }
}
Run Code Online (Sandbox Code Playgroud)

我应该在这里等待两次还是没有意义?据我所知,两者都awaits提高了响应能力,而.Remove自身"阻止"响应时间几乎不明显,这是正确的吗?

Igo*_*gor 8

在你的情况下async/await,与某些事情的执行速度无关.它用于在I/O完成时挂起线程,因此操作系统可以将其重用于当前需要线程的任何其他内容.简而言之,它就是可扩展性.上面的代码进行了2次I/O调用,一次用于检索,一次用于删除(调用时SaveChangesAsync).

您可以简化此操作,只需拨打1次删除即可,但这与async/await无关.在上面的代码中,如果您已经知道主键,则没有理由首先转到数据库(假设此处ID是主键).

public static async Task Remove(int id)
{
    using (var ctx = new StoreContext())
    {
        var product = new Product { ID = id};
        ctx.Products.Attach(product);
        ctx.Products.Remove(product);
        await ctx.SaveChangesAsync();
    }
}
Run Code Online (Sandbox Code Playgroud)

只要DbSet<T>.Remove它在内部"排队"一个删除操作,然后在调用SaveChanges或SaveChangesAsync时执行该操作.它不会"阻止"任何东西,但如果您不相信,也许您应该详细说明单词块的含义.