【问题标题】:Remove row asynchronously using Entity Framework使用实体框架异步删除行
【发布时间】:2018-12-12 05:17:25
【问题描述】:

我对 async 还是很陌生,所以我不确定我所做的是否是多余的。下面从数据库中删除一行:

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();
    }
}

我应该在这里等两次还是没有意义?据我所知,awaits 都提高了响应能力,而.Remove 本身在几乎不明显的时间内“阻止”了响应能力,对吗?

【问题讨论】:

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


    【解决方案1】:

    在您的情况下,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();
        }
    }
    

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

    【讨论】:

    • 我明白了,但是如果我必须进行 2 次 i/o 调用,那么在那里进行 2 次等待是否有意义? (例如如果我没有使用主键删除)
    • @JoeDefill - 是的,因为你有 2 个 I/O 调用,所以如果你想进行 2 个异步调用(好处是没有线程等待调用完成),那么你需要一个 await两个电话。
    • @JoeDefill 您希望做什么?您要与之比较的替代方案是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多