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

C# 为什么这些任务按顺序执行?,c#,parallel-processing,task,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; }

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

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());
再次编辑:谢谢大家

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

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());
它不会,除非在
Count
方法中有同步访问单个资源的方法。如果它可以并行化,那么它将并行运行


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

只需替换
tasks.Add(Task.Factory.StartNew(()=>Count(ref counter,block))控制台编写代码>。编写线
并调试代码

您从不创建多个任务。

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

}
for(int i=0;i=max)
控制台写入线(i);
其他的
block=max-i;
}

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

你有多少个CPU/内核?有什么证据表明它没有被并行化?问题可能在于你对正在发生的事情的观察,而不是实际发生的事情。作为对你编辑的回应,什么是
Coin
,执行需要多长时间。还有,什么是
?它可能是一个大数字,一个小数字,0,还是什么?还要注意,
Interlocked
调用将在所有任务之间增加一定程度的同步,从而限制潜在的并行化,通过让每个任务返回计数值的
int
,然后聚合所有已完成任务的结果,可以避免使用
联锁的
同步。您能提供完整的代码示例吗?如果是这样的话!我希望看到这样的并行执行的核心利用率达到100%,但我实际得到的是12.5%,这正好是一个线程。不幸的是,我的IDE中没有可供使用的并发可视化工具,因此这是我得到的最好证据。我将编辑我的问题以包括计数方法。@user1949917如果任务完成得非常快,那么我希望看到12.5%的利用率。如果处理一个迭代所需的时间很短,但迭代的数量很大,那么您应该让每个任务处理多个迭代,而不仅仅是一个。
for (int i = 0; i <= max; i += block)
{
    tasks.Add(Task.Factory.StartNew(() => Count(ref counter, block)));
    if (i + block >= max) { block = max - i; }
}