我试图向ConcurrentBag添加多个值,但实际上没有值进入。起初我尝试使用List,但显然不是"线程安全"所以我搜索了一下,似乎人们建议使用ConcurrentBag。我尝试将Thread.Sleep(100)与List一起使用,但是效果很好。如何正确添加值? debuger总是显示" Count:0"。这是我的代码:
foreach (KeyValuePair<string, string> entry in test_Words)
{
Form1.fr.progressBar1.Value++;
new Thread(delegate () {
switch (test_Type)
{
case "Definitions":
bagOfExercises.Add(Read(Definitions.get(entry.Value, entry.Key)));
break;
case "Examples":
bagOfExercises.Add(Read(Examples.get(entry.Value, entry.Key)).Replace(entry.Key, new string('_', entry.Key.Length)));
break;
}
}).Start();
}
答案 0 :(得分:1)
PLinq的例子:
Func<KeyValuePair<string, string>, string> get;
if(test_Type == "Definitions")
{
get = kvp => Read(Definitions.get(kvp.Value, kvp.Key));
}
else
{
get = kvp => Read(Examples.get(kvp.Value, kvp.Key)).Replace(entry.Key, new string('_', kvp.Key.Length)));
}
var results = test_Words.AsParallel()
.WithDegreeOfParallelism(test_Words.Count())
.Select(get)
.ToList();
这会尝试每个条目使用一个线程。通常情况下,PLinq将决定什么是资源的最佳使用,但在这种情况下,我们知道PLinq无法知道的事情:我们在外部资源上等待很多,这可以大规模并行完成。