5

为什么下面的代码是顺序执行的?

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);
}

再次编辑:谢谢大家!

4

3 回答 3

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;

}
于 2013-01-04T22:11:46.037 回答
1

为什么下面的代码顺序执行?

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

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

于 2013-01-04T22:05:21.380 回答
1

在我看来,您的循环/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;
}

如果我没看错,你只会添加一个任务 ifi + block >= max并且你只会循环 if 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; }
}
于 2013-01-04T22:11:53.013 回答