我有些低估了如何使用并行线程使变量成为本地变量的麻烦。简而言之,我有一个名为SingleRecord
的{{1}}列表。通过一些基于RecordList
变量的逻辑,我有了一些局部变量。我希望每个并行线程都有自己的SingleRecord
和IntVal
,然后将它们添加到所有并行线程都可以访问的表中。正在阅读有关此内容的一些内容,但不确定我是否完全理解它的工作原理。
StringVal
答案 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; }
}
答案 1 :(得分:-1)
我不太确定我是否理解您的问题,但我想您是在问:在您按预期方式工作的代码中,为什么它起作用?
SingleRecord =>
{
int IntVal = 0;
string StringVal = string.Empty;
IntVal = some logic;
StringVal = SingleRecord + some logic;
MyTable.Rows.Add(IntVal, StringVal);
}
在此部分代码中,您说的是“对于每个单条记录,请一起调用此函数”。关键是,您要创建一个匿名函数并将其传递给ForEach。不会立即进行评估。
匿名函数在其功能块中声明其自己的局部变量,因此这些变量仅在该迭代的范围内(在这种情况下,对于每个记录)。