【问题标题】:C# Task.WaitAll slow , any alternativeC# Task.WaitAll 慢,任何选择
【发布时间】:2016-06-11 17:40:16
【问题描述】:

我正在使用 c# 对数据库表进行数据处理,每个循环它处理大约 3000 个员工数据。 每个员工大约需要 2 秒才能完成

这意味着太多时间(2*3000=6000 秒/循环) 所以我们决定使用 .net 线程,但 Task.WaitAll 仍然面临同样的缓慢

任何想法,任何替代方案,如何同时完成?或时间比这快

这是我们的服务代码

我的算法是这样的

  1. 获取所有新员工的操作

  2. 并行循环遍历每个员工(如果为 1,则在 2 秒内完成 员工)

对于许多员工来说,即使有任务也需要很长时间

  1. 再次获取新员工的操作

    /// seperate tasks
        List<Task> tasks = new List<Task>();
        foreach (Helper.Employeedata employee in employees)
        {
            Task t = Task.Factory.StartNew(() =>
            {
                employee.loadActions();
            });
    
            tasks.Add(t);
        }
    
        Console.WriteLine("Waiting ...");
        Task.WaitAll(tasks.ToArray());
    

【问题讨论】:

  • 你是说Task.WaitAll很慢,还是说你在线程中做的工作很慢?你知道Task.WaitAll 会等到工作完成(因此得名)?
  • 它的慢与不使用任务一样,在同一时间完成,每个循环超过1小时,我需要减少它,因为每个员工需要2秒,但使用任务在这里没有效果跨度>
  • @Eng-AymanAbdulhamidElarian 你在loadActions 中有一些东西不能让它并行运行,如果我们没有看到它在做什么,我们就帮不了你。任何其他替代方案都会有同样的问题,您必须修复 loadActions 以允许它并行运行。如果您正在与数据库交谈,您可能只需要正确表上的索引,但除非您向我们展示您在做什么,否则我们无法告诉您什么索引。
  • @Eng-AymanAbdulhamidElarian 不,您只需从一项询问 3000 个问题的任务切换到询问一个问题的 3000 个任务
  • 如果您使用的是实体框架,众所周知,像这样批量更新行是不好的,有一些方法可以解决它,但首先您必须向我们展示您是如何保存的,所以我们知道什么建议的解决方案!

标签: c# .net multithreading task-parallel-library


【解决方案1】:
Parallel.ForEach(employees, employee => loadAction(employee));

如果“loadActions”是 CPU 密集型的,那么除了升级计算机或重写代码之外,您无能为力。

【讨论】:

  • 如果只是cpu,那么他会看到时间减少-但无论是否并行,都需要相同的时间。所以cpu不是原因
  • cpu 不是我在强大的服务器上测试它的原因
猜你喜欢
  • 1970-01-01
  • 2016-02-09
  • 2016-09-12
  • 1970-01-01
  • 2015-11-16
  • 1970-01-01
  • 2017-12-07
  • 1970-01-01
  • 2014-05-15
相关资源
最近更新 更多