Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Task.WaitAll慢,有其他选择吗_C#_.net_Multithreading_Task Parallel Library - Fatal编程技术网

C#Task.WaitAll慢,有其他选择吗

C#Task.WaitAll慢,有其他选择吗,c#,.net,multithreading,task-parallel-library,C#,.net,Multithreading,Task Parallel Library,我使用c#对数据库表进行数据处理,每个循环处理大约3000个员工数据。 每个员工大约需要2秒钟才能完成 这意味着时间太长(2*3000=6000秒/圈) 所以我们决定使用.net线程,但Task.WaitAll仍然面临同样的速度 任何想法,任何选择,如何在同一时间完成?或者比这更快的时间 这是我们的服务代码 我的算法是这样的 获取所有新员工操作 /// seperate tasks List<Task> tasks = new List<Task>();

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

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

任何想法,任何选择,如何在同一时间完成?或者比这更快的时间

这是我们的服务代码

我的算法是这样的

  • 获取所有新员工操作

  • /// 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());
    
  • 并行循环每个员工(如果为1,则在2秒钟内完成 (雇员)

  • 这里的问题对于许多员工来说,即使是执行任务也需要很长时间

  • 重新获取新员工操作

    /// 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());
    
    ///分离任务
    列表任务=新列表();
    foreach(雇员中的Helper.Employeedata雇员)
    {
    Task t=Task.Factory.StartNew(()=>
    {
    employee.loadActions();
    });
    任务。添加(t);
    }
    控制台。WriteLine(“等待…”);
    Task.WaitAll(tasks.ToArray());
    

  • 如果“loadActions”是CPU密集型的,那么除了升级计算机或重写代码之外,你什么也做不了。

    你是说
    Task.WaitAll
    很慢,还是说你在线程中做的工作很慢?您确实意识到,
    Task.WaitAll
    将等待工作完成(因此得名)?其速度与不使用任务一样慢,在同一时间内完成,每个循环超过1小时,我需要减少,因为每个员工需要2秒,但使用任务并没有效果here@Eng-AymanAbdulhamidElarian您在
    loadActions
    中有一些东西不能让它并行运行,如果我们看不到它在做什么,我们无法帮助您。任何其他修改都会有相同的问题,您必须修复
    loadActions
    以允许它并行运行。如果您正在与DB交谈,很可能您只需要在正确的表上建立索引,但除非您向我们展示您正在做的事情,否则我们无法告诉您索引是什么。@Eng AymanAbdulhamidElarian No,您只需从一个任务问3000个问题切换到3000个任务问一个问题,如果您使用Entity Framework,那么批量更新行是很糟糕的,有很多方法可以修复它,但首先您必须向我们展示您是如何保存的,以便我们知道建议什么解决方案!如果它只是cpu,那么他会看到时间的减少——但如果并行与否,它需要相同的时间。所以cpu不是原因cpu不是原因我在一个强大的服务器上测试它