我创建了这个正常的 for 循环:
public static Dictionary<string,Dictionary<string,bool>> AnalyzeFiles(IEnumerable<string> files, IEnumerable<string> dependencies)
{
Dictionary<string, Dictionary<string, bool>> filesAnalyzed = new Dictionary<string, Dictionary<string, bool>>();
foreach (var item in files)
{
filesAnalyzed[item] = AnalyzeFile(item, dependencies);
}
return filesAnalyzed;
}
该循环仅检查变量“files”中的每个文件是否具有变量“dependencies”中指定的所有依赖项。
“文件”变量应该只有唯一的元素,因为它被用作结果的键,一个字典,但我在调用方法之前检查了这个。
for 循环工作正常,所有元素都在单线程中处理,所以我想通过更改为并行 for 循环来提高性能,问题是并非所有来自“files”变量的元素都在并行(在我的测试用例中,我得到 30 个元素而不是 53 个)。
我试图增加时间跨度,或者删除所有“Monitor.TryEnter”代码并只使用一个锁(filesAnalyzed)但仍然得到相同的结果
我对并行器不是很熟悉,所以它可能是我正在使用的语法中的东西。
public static Dictionary<string,Dictionary<string,bool>> AnalyzeFiles(IEnumerable<string> files, IEnumerable<string> dependencies)
{
var filesAnalyzed = new Dictionary<string, Dictionary<string, bool>>();
Parallel.For<KeyValuePair<string, Dictionary<string, bool>>>(
//start index
0,
//end index
files.Count(),
// initialization?
()=>new KeyValuePair<string, Dictionary<string, bool>>(),
(index, loop, result) =>
{
var temp = new KeyValuePair<string, Dictionary<string, bool>>(
files.ElementAt(index),
AnalyzeFile(files.ElementAt(index), dependencies));
return temp;
}
,
//finally
(x) =>
{
if (Monitor.TryEnter(filesAnalyzed, new TimeSpan(0, 0, 30)))
{
try
{
filesAnalyzed.Add(x.Key, x.Value);
}
finally
{
Monitor.Exit(filesAnalyzed);
}
}
}
);
return filesAnalyzed;
}
任何反馈表示赞赏