c# - 我对 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已处理”。但是,只有一些项目有已处理!!!
你知道代码出了什么问题吗?
解决方案
finally 不会对集合中的每个项目运行该操作。如果您想对集合中的每个项目执行一些操作,这就是 body 的用途。init 和 finally 用于初始化和拆除每个工作线程。因此,您的打印输出告诉您在处理您的项目时使用了三个线程。
推荐阅读
- ruby-on-rails - Ruby on Rails - 无法从 Slim View 访问更新的模型
- javascript - 使用 Function.prototype.bind 创建的函数对象
- swift - Swift:修复导航栏过渡到另一个视图控制器
- python - 使用 Python 计算 VLOOKUPS 的列数
- sage-300 - Sage 300 情报报告不适用于管理员用户
- java - 始终在 recyclerView 适配器上显示第一个突出显示的项目,无需单击任何项目
- javascript - Javascript返回带有属性的对象值
- javascript - jQuery & Snap.svg -> 圆圈没有正确跟随鼠标
- ruby-on-rails - Carrierwave:无法将图像解析为 URL:未定义的方法“to_model”
- ionic-framework - 当我有 ionic CLI 4.6.0 时,我可以运行 ionic v1 项目吗?