我有 8 个逻辑处理器。当执行以下代码时
public void test()
{
Parallel.For(1, 1001, i => { IntensiveWork(i); });
}
private static void IntensiveWork(int i)
{
Random r = new Random();
Thread.Sleep(r.Next(i * 1));
}
我注意到Parallel.For
进行多批 8 个作业。每个批次将按顺序执行。这里的问题是,如果该批次中的 7/8 个作业完成,那么下一个批次将继续等待最后一个作业完成。这意味着7个核心不会很忙。有没有更好的方法来实现并行性,即 C#,一旦批处理中的一个作业完成,它就会为该核心分配另一个作业。
您可以创建多个任务将从中读取的单个队列。
static void test()
{
ConcurrentQueue<int> queue = new ConcurrentQueue<int>(Enumerable.Range(1, 1000));
int taskCount = Environment.ProcessorCount;
Task[] tasks = new Task[taskCount];
for (int taskIndex = 0; taskIndex < taskCount; taskIndex++)
{
Task task = Task.Factory.StartNew(() => IntensiveWorkTask(queue));
tasks[taskIndex] = task;
}
Task.WaitAll(tasks);
}
private static void IntensiveWorkTask(ConcurrentQueue<int> queue)
{
while (queue.TryDequeue(out int value))
IntensiveWork(value);
}
private static void IntensiveWork(int i)
{
Random r = new Random();
Thread.Sleep(r.Next(i * 1));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)