通过多线程将项添加到ConcurrentBag

时间:2018-03-02 00:32:14

标签: c# multithreading list

我试图向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();           
            }

1 个答案:

答案 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无法知道的事情:我们在外部资源上等待很多,这可以大规模并行完成。