【问题标题】:EF loop to update with async await使用异步等待更新的 EF 循环
【发布时间】:2014-05-16 19:38:19
【问题描述】:

我需要通过慢速网络使用大约 10 万条记录更新我的数据库。

我认为异步运行它们可能是个好主意,而不必在运行下一个之前等待响应。我已经走到这一步了:

        private async void button2_Click(object sender, EventArgs e)
        {

            var customerIDs = File.ReadAllLines(@"c:\temp\customerids.txt").ToList();

            foreach (var customerID in customerIDs)
            {
                var result = await DoSomethingWithTheCustomerAsync(customerID);
            }
            MessageBox.Show("Done");
        }



 private static async Task<bool> DoSomethingWithTheCustomerAsync(string strCustomerid)
        {
            var customerid = int.Parse(strCustomerid);
            using (var ctx = new MyEntities())
            {

                var customer = await ctx.Customers.FirstOrDefaultAsync(c => c.CustomerID == customerid);
                customer.CustomerNotes += " updated async";
                await ctx.SaveChangesAsync();
                return true;
            }
        }

我真的不想在 foreach 循环中等待结果然后继续。我想在循环运行后等待所有任务。我尝试用任务制作一个列表并执行 Task.WaitAll(tasklist) 但是数据库没有更新。

如果可以做到这一点,这是个好主意吗?

【问题讨论】:

    标签: c# .net entity-framework asynchronous async-await


    【解决方案1】:

    如果可能,请尝试在单个消息中执行此操作,并在服务器端完成“批处理”。例如,存储过程。

    可以同时启动 10 万个数据库操作(超过 10 万个单独的连接),但这可能会使您的数据库崩溃:

    private async void button2_Click(object sender, EventArgs e)
    {
      var customerIDs = File.ReadAllLines(@"c:\temp\customerids.txt").ToList();
      var updates = customerIDs.Select(id => DoSomethingWithTheCustomerAsync(id));
      var results = await Task.WhenAll(updates);
      MessageBox.Show("Done");
    }
    

    【讨论】:

      【解决方案2】:

      意识到这不是使用 EF 路由,但请查看 SqlBulkCopy 类。这将更有效地插入您的行。您还可以将它们按行分组以使其更快。

      【讨论】:

      • 不是 100 - 10.000。 SqlBulkCopy 在设置中有开销 - 对 100 行进行操作并不聪明。我通常在 LAN 中每次更新使用 60.0000 行。
      • 抱歉,您原来的帖子有点含糊。 SqlBulkCopy 是“使用来自另一个源的数据批量加载 SQL Server 表”。如果您想批量更新,您可以bulk load to a temporary table first and then Merge the data in using a stored procedure。另一种方法是将您的数据放入 Table 数据类型中,并将其批量传递给您的存储过程。可能值得使用不同的方法进行一些负载测试,看看哪种方法最适合您。
      猜你喜欢
      • 2021-04-15
      • 2019-07-02
      • 1970-01-01
      • 1970-01-01
      • 2017-12-12
      • 2021-10-18
      • 2021-07-17
      • 2013-01-01
      • 2021-09-09
      相关资源
      最近更新 更多