C# 如何计算并行计算的完成百分比?

C# 如何计算并行计算的完成百分比?,c#,for-loop,console,parallel.for,C#,For Loop,Console,Parallel.for,使用for计算完成百分比很容易: for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { // Do somethings... Console.WriteLine("{0}% Done!", i * 10 + j + 1); } } 但是我不知道用并行计算完成百分比。对于: Parallel.For(0, 10, i => { Paralle

使用
for
计算完成百分比很容易:

for (int i = 0; i < 10; i++)
{
    for (int j = 0; j < 10; j++)
    {
        // Do somethings...
        Console.WriteLine("{0}% Done!", i * 10 + j + 1);
    }
}

但是我不知道用
并行计算完成百分比。对于

Parallel.For(0, 10, i =>
{
    Parallel.For(0, 10, j =>
    {
        // Do somethings...
        Console.WriteLine("{0}% Done!", i * 10 + j + 1);
    });
});
输出:

1% Done!
2% Done!
3% Done!
4% Done!
5% Done!
6% Done!
7% Done!
8% Done!
9% Done!
10% Done!
11% Done!
12% Done!
13% Done!
...
93% Done!
94% Done!
95% Done!
96% Done!
97% Done!
98% Done!
99% Done!
100% Done!
1% Done!
2% Done!
3% Done!
51% Done!
52% Done!
53% Done!
54% Done!
55% Done!
56% Done!
57% Done!
58% Done!
59% Done!
60% Done!
4% Done!
5% Done!
6% Done!
...
69% Done!
70% Done!
71% Done!
72% Done!
73% Done!
74% Done!
75% Done!
76% Done!
77% Done!
78% Done!
79% Done!
80% Done!
36% Done!
37% Done!
38% Done!
39% Done!
40% Done!
35% Done!
输出未显示正确的完成百分比


如何在
并行中计算完成百分比。对于
而不降低性能?

您可以使用
联锁。增量
方法:

int progress = 0;
Parallel.For(0, 10, i =>
{
    Parallel.For(0, 10, j =>
    {
        // Do somethings...
        Console.WriteLine("{0}% Done!", Interlocked.Increment(ref progress));
    });
});

内部循环的每次迭代将有一个增量。某些打印输出可能会出现顺序错误-特别是当线程在获得新的进度值后但在打印完成之前被抢占时。

对于这样一个简单的情况,当您知道您正在处理100个项目时,只需使用一个外部变量(线程安全地)递增并报告:

int progress = 0;
Parallel.For(0, 10, i =>
{
    Parallel.For(0, 10, j =>
    {
        // Do somethings...
        Console.WriteLine("{0}% Done!", Interlocked.Increment(ref progress));
    });
});

但是请注意,您可能仍然会得到一些无序报告的值(因为并行任务将执行增量,然后必须竞争对
控制台的访问权限,这是一种独占资源)

在递增计数器后,您仍然需要对其进行规范化。为什么需要精确的顺序,报告的完成百分比?(除<代码>