【发布时间】:2016-06-11 17:40:16
【问题描述】:
我正在使用 c# 对数据库表进行数据处理,每个循环它处理大约 3000 个员工数据。 每个员工大约需要 2 秒才能完成
这意味着太多时间(2*3000=6000 秒/循环) 所以我们决定使用 .net 线程,但 Task.WaitAll 仍然面临同样的缓慢
任何想法,任何替代方案,如何同时完成?或时间比这快
这是我们的服务代码
我的算法是这样的
获取所有新员工的操作
并行循环遍历每个员工(如果为 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());
【问题讨论】:
-
你是说
Task.WaitAll很慢,还是说你在线程中做的工作很慢?你知道Task.WaitAll会等到工作完成(因此得名)? -
它的慢与不使用任务一样,在同一时间完成,每个循环超过1小时,我需要减少它,因为每个员工需要2秒,但使用任务在这里没有效果跨度>
-
@Eng-AymanAbdulhamidElarian 你在
loadActions中有一些东西不能让它并行运行,如果我们没有看到它在做什么,我们就帮不了你。任何其他替代方案都会有同样的问题,您必须修复loadActions以允许它并行运行。如果您正在与数据库交谈,您可能只需要正确表上的索引,但除非您向我们展示您在做什么,否则我们无法告诉您什么索引。 -
@Eng-AymanAbdulhamidElarian 不,您只需从一项询问 3000 个问题的任务切换到询问一个问题的 3000 个任务
-
如果您使用的是实体框架,众所周知,像这样批量更新行是不好的,有一些方法可以解决它,但首先您必须向我们展示您是如何保存的,所以我们知道什么建议的解决方案!
标签: c# .net multithreading task-parallel-library