使用局部和非局部变量的C#Parallel Foreach

时间:2018-07-17 20:32:54

标签: c# parallel.foreach

我有些低估了如何使用并行线程使变量成为本地变量的麻烦。简而言之,我有一个名为SingleRecord的{​​{1}}列表。通过一些基于RecordList变量的逻辑,我有了一些局部变量。我希望每个并行线程都有自己的SingleRecordIntVal,然后将它们添加到所有并行线程都可以访问的表中。正在阅读有关此内容的一些内容,但不确定我是否完全理解它的工作原理。

StringVal

2 个答案:

答案 0 :(得分:0)

我要做的是使用并发集合来保留每个迭代处理结果,然后将结果转换为数据表。例如,

private static void RunString()
        {
            var recordList = new List<string> {"1", "two", "three", "four", "five", "six"};

            var result = new ConcurrentBag<ProcessedData>();
            Parallel.ForEach(recordList
                , record => //body
                {
                    var integerValue = record.Length;
                    var processedString = record + " Processed";

                    var processedData = new ProcessedData
                    {
                        IntegerValue = integerValue,
                        StringValue = processedString
                    };
                    result.Add(processedData);
                });

            var myDataSet = new DataSet();
            var myTable = myDataSet.Tables.Add();

            myTable.Columns.Add("NumberVal", typeof(int));
            myTable.Columns.Add("TextVal", typeof(string));
            foreach (var item in result)
            {
                Console.WriteLine($"{item.IntegerValue} has {item.StringValue}");
                myTable.Rows.Add(item.IntegerValue, item.StringValue);
            }
        }

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

此代码打印以下值 enter image description here

答案 1 :(得分:-1)

我不太确定我是否理解您的问题,但我想您是在问:在您按预期方式工作的代码中,为什么它起作用?

SingleRecord =>
    {
        int IntVal = 0;
        string StringVal = string.Empty;

        IntVal = some logic;
        StringVal = SingleRecord + some logic; 

        MyTable.Rows.Add(IntVal, StringVal);
    }

在此部分代码中,您说的是“对于每个单条记录,请一起调用此函数”。关键是,您要创建一个匿名函数并将其传递给ForEach。不会立即进行评估。

匿名函数在其功能块中声明其自己的局部变量,因此这些变量仅在该迭代的范围内(在这种情况下,对于每个记录)。