c# - 我对 Parallel.ForEach 做错了什么

标签 c# .net parallel.foreach

我在 C# 中使用 Parallel.ForEach 编写了以下代码

internal class Program
{
    private static void Main(string[] args)
    {
        var recordList = new List<string> {"1", "two", "three", "four", "five", "six"};

        var result = new ConcurrentBag<ProcessedData>();

        Parallel.ForEach<string, ProcessedData>(recordList, () => null //local init
            , (record, state, index, localInit) => //body
            {
                Console.WriteLine($"Processing {record}");
                var integerValue = record.Length;
                var processedString = record + " Processed";

                localInit = new ProcessedData
                {
                    IntegerValue = integerValue,
                    StringValue = processedString
                };

                return localInit;
            }, bodyResult => //local finally
            {
                Console.WriteLine($"Adding {bodyResult.StringValue}");
                result.Add(bodyResult);
            });


        foreach (var item in result)
        {
            Console.WriteLine($"{item.StringValue}");
        }

        Console.ReadLine();
    }

    private sealed class ProcessedData
    {
        internal int IntegerValue { get; set; }
        internal string StringValue { get; set; }
    }

当我运行程序时,我希望控制台打印出来 “1个处理”,“2个处理”,“3个处理”,“4个处理”,“5个处理”,“6个处理”。但是,只有一些项目被处理了!!!

enter image description here

你知道代码出了什么问题吗?

最佳答案

finally 不会对集合中的每个项目运行该操作。如果您想对集合中的每个项目执行一些操作,这就是正文的用途。 init 和 finally 用于初始化和拆除每个工作线程的。所以您的打印输出告诉您在处理您的项目时使用了三个线程。

关于c# - 我对 Parallel.ForEach 做错了什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51390668/

相关文章:

c# - LINQ 选择新的 KeyValuePair<T,List<T2>>

c# - Caesar Cipher C# - 如何处理大写和小写字母

c# - 如何在 C# 中捕获调用 C++ dll 的异常

c# - 分层架构中的 Entity Framework ?

c# - 将对象的哈希码定义为所有类变量哈希码的总和、乘法等等是不正确的吗?

c# - 谷歌地理定位 API 库

.net - 使用 .net 方法但不使用 powershell cmdlet 的文件

vb.net - Parallel.ForEach 每次给出不同的结果

c# - Parallel.ForEach 问题 - 读写文件 - 文件正在使用错误

c# - 在 Parallel.ForEach 中使用 KeyValuePair<String, String>