[英]C# MultiThreading Loop entire DataTable while limiting threads to 4
这可能是一个棘手的问题,但我拥有的是一个包含 1000 行的数据表。 对于这些行中的每一行,我想在一个新线程上处理。 但是我想将线程限制为 4 个线程。 所以基本上我一直保持 4 个线程运行,直到处理完整个数据表。
目前我有这个;
foreach (DataRow dtRow in urlTable.Rows)
{
for (int i = 0; i < 4; i++)
{
Thread thread = new Thread(() => MasterCrawlerClass.MasterCrawlBegin(dtRow));
thread.Start();
}
}
我知道这是倒退,但我不确定如何实现我正在寻找的东西。 我想到了一个非常复杂的 while 循环,但也许这不是最好的方法? 任何帮助总是感激。
最简单的解决方案是,如果你有 4 个 CPU 内核 - Parallel LINQ +Degree of parallelism == 4 会给你每个 CPU 内核一个线程,否则你必须在线程/任务之间手动分配记录,请参阅下面的两个解决方案:
urlTable.Rows.AsParallel().WithDegreeOfParallelism(4)
.Select(....)
手动分发:
您可以使用简单的技巧通过工作线程手动分发项目:N 线程将从输入列表中选取每个N+4
项目,例如:
0+4
== 0, 3, 7...1+4
== 1, 4, 8...2+4
==...private void ProcessItems(IEnumerable<string> items)
{
// TODO: ..
}
var items = new List<string>(Enumerable.Range(0, 1000)
.Select(i => i + "_ITEM"));
var items1 = items.Where((item, index) => (index + 0) % 4 == 0);
var items2 = items.Where((item, index) => (index + 1) % 4 == 0);
var items3 = items.Where((item, index) => (index + 2) % 4 == 0);
var items4 = items.Where((item, index) => (index + 3) % 4 == 0);
var tasks = new Task[]
{
factory.StartNew(() => ProcessItems((items1))),
factory.StartNew(() => ProcessItems((items2))),
factory.StartNew(() => ProcessItems((items3))),
factory.StartNew(() => ProcessItems((items4)))
};
Task.WaitAll(tasks);
MSDN:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.