为什么这些任务按顺序执行?

时间:2013-01-04 22:01:10

标签: c# parallel-processing task

为什么以下代码按顺序执行?

List<Task> tasks = new List<Task>();

for (int i = 0; i <= max; i += block)
{
    if (i + block >= max)
        tasks.Add(Task.Factory.StartNew(() => Count(ref counter, block)));
    else
        block = max - i;
}

Task.WaitAll(tasks.ToArray());

我还使用Parallel.Invoke测试了这个版本;它也不能并行执行。肯定会有一些我不理解的东西,但是当我尝试谷歌搜索时,我主要得到关于如何强制顺序执行的说明。

作为对下面答案中给出的警告之一的回应,我已经包括以下方法供参考:

static void Count(ref int counter, int num)
{
    int localCounter = 0;
    for (int i = 0; i < num; i++)
        if (Coin()) localCounter++;
    System.Threading.Interlocked.Add(ref counter, localCounter);
}

再次编辑:谢谢大家!

3 个答案:

答案 0 :(得分:4)

只需将tasks.Add(Task.Factory.StartNew(() => Count(ref counter, block)));替换为Console.WriteLine并调试代码。

您永远不会创建多个任务。

for (int i = 0; i <= max; i += block)
{
    if (i + block >= max)
        Console.WriteLine(i);
    else
        block = max - i;

}

答案 1 :(得分:1)

  

为什么以下代码按顺序执行?

它没有,除非你在Count方法中有一些同步访问单个资源的东西。如果它可以并行化,那么它将并行运行。

如果Count执行得非常快,那么你会发现任务的完成速度比新任务的安排要快,这就是为什么它们都可以按顺序执行。

答案 2 :(得分:1)

我觉得你的loop / if语句有问题:

for (int i = 0; i <= max; i += block)
{
    if (i + block >= max)
        tasks.Add(Task.Factory.StartNew(() => Count(ref counter, block)));
    else
        block = max - i;
}

如果我正确阅读,您只会在i + block >= max添加任务,并且只会i + block <= max循环(显示计数器增加和条件检查)。因此,您只需添加一次任务。

此外,当您不添加任务时,您正在更改阻止。我希望你想要更像下面这样的东西,但是如果没有更多的代码我就无法确定:

for (int i = 0; i <= max; i += block)
{
    tasks.Add(Task.Factory.StartNew(() => Count(ref counter, block)));
    if (i + block >= max) { block = max - i; }
}