【问题标题】:Insert data asynchronously into database using Entity Framework [closed]使用实体框架将数据异步插入数据库[关闭]
【发布时间】:2016-02-16 22:28:27
【问题描述】:

我的存储库中有一个使用实体框架插入数据的方法。我需要将此方法转换为异步方法。我该怎么做?

这是我的方法:

public void movetosecondpost(ProcessingPost processingPost)
{
        SuccessPost movedQueue = new SuccessPost();
        movedPost.Id = processingPost.Id;
        Context.ProcessingPost.Remove(processingPost);
        Context.SuccessPost.Add(movedPost);
}

在我的上下文中,我有这两种保存方法:

   public override int SaveChanges()
   {
        return base.SaveChanges();
   }

   public override Task<int> SaveChangesAsync(CancellationToken cancellationToken)
   {
        cancellationToken.ThrowIfCancellationRequested();
        return base.SaveChangesAsync(cancellationToken);
   }

【问题讨论】:

    标签: c# entity-framework asynchronous


    【解决方案1】:

    只有当您使用 async 关键字将其标记为异步时,该方法才能是异步的:

    public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken)
    {
        cancellationToken.ThrowIfCancellationRequested();
        return await base.SaveChangesAsync(cancellationToken);
    }
    

    您现在可以使用await 关键字将Task&lt;int&gt; 的结果展开为int。这基本上就是返回Task&lt;int&gt;int 之间的区别。该任务只是一个承诺:我将执行一个返回 int 的操作,但我不知道确切的时间。 在对数据库进行更改时,您的线程除了等待它完成之外无能为力,因此通过异步执行,您的线程将在发生这种情况时移回线程池。一旦数据库操作完成,就会从线程池中获取另一个线程,然后您的方法将继续。

    【讨论】:

    • 我需要对 movetosecondpost 方法进行哪些更改?
    • @Alma 在这种方法中,您不会做任何可以从异步中受益的事情。从上下文中创建/添加/删除实体都发生在内存中。只有当你调用SaveChanges IO 正在执行时,这就是异步进入图片的地方。
    • 他的 SaveChanges 已经是异步的。 async 修饰符是被调用方法的实现细节。调用者无法检测到使用了异步。这个提议的代码创建了一个“代理任务”,但没有其他任何变化。
    • 很好地解释了关键字“await”的使用
    【解决方案2】:

    将此方法 (movetosecondpost) 设为异步是没有意义的,因为它不涉及任何异步工作(例如 IO)。如果它包括将更改保存到数据库,则可以使其异步。

    如果有一个方法调用此方法,然后调用SaveChanges,那么您可以使该方法异步。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      • 1970-01-01
      • 1970-01-01
      • 2020-05-24
      • 2013-01-06
      相关资源
      最近更新 更多