C# 通过多线程将项目添加到ConcurrentBag

C# 通过多线程将项目添加到ConcurrentBag,c#,multithreading,list,C#,Multithreading,List,我试图向ConcurrentBag添加多个值,但实际上没有值进入。起初,我尝试使用列表,但显然这不是“线程安全的”,所以我四处搜索,似乎有人建议使用ConcurrentBag。我试着用Thread.Sleep(100)和List一起工作,但速度较慢。如何正确地添加值?调试程序始终显示“计数:0”。这是我的密码: foreach(测试字中的KeyValuePair条目) { Form1.fr.progressBar1.Value++; 新线程(委托(){ 开关(测试型) { 案例“定义”: 添加

我试图向ConcurrentBag添加多个值,但实际上没有值进入。起初,我尝试使用列表,但显然这不是“线程安全的”,所以我四处搜索,似乎有人建议使用ConcurrentBag。我试着用Thread.Sleep(100)和List一起工作,但速度较慢。如何正确地添加值?调试程序始终显示“计数:0”。这是我的密码:

foreach(测试字中的KeyValuePair条目)
{
Form1.fr.progressBar1.Value++;
新线程(委托(){
开关(测试型)
{
案例“定义”:
添加(读取(Definitions.get(entry.Value,entry.Key));
打破
案例“实例”:
bagOfExercises.Add(Read(Examples.get(entry.Value,entry.Key)).Replace(entry.Key,newstring(“”,entry.Key.Length));
打破
}
}).Start();
}
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();
Func-get;
如果(测试类型==“定义”)
{
get=kvp=>Read(Definitions.get(kvp.Value,kvp.Key));
}
其他的
{
get=kvp=>Read(Examples.get(kvp.Value,kvp.Key)).Replace(entry.Key,新字符串(“”,kvp.Key.Length));
}
var结果=测试单词.AsParallel()
.具有平行度(test_Words.Count())
。选择(获取)
.ToList();

这将尝试为每个条目使用一个线程。通常,PLinq将决定什么是资源的最佳利用,但在这种情况下,我们知道PLinq不知道的事情:我们需要大量的外部资源,这可以大规模并行完成。

测试类型的价值是什么?如果在
bagOfExercises.Add
行上放置断点,它们会被命中吗?如果在
断点上设置断点行被击中了吗?问题是什么?凯文,我在问我如何正确地为包添加值。测试类型是一个字符串。调试时不会向包中添加任何值,它只是保持在0。您正在为每个条目启动一个线程。。。然后你就不用等他们中的任何一个完成了。怪不得现在的速度太快了,你却得不到结果。我会说并行。如果你不等待他们完成,再尝试一次。。。你不会得到结果的。我从来没有说过你应该依次等待每一个,但在某一点上你必须等待所有的。如果你不。。。你没有结果。再说一遍:线程有点难,我建议你再试试
Parallel.ForEach
。甚至可能是PLinq的
.aspallel()
。这比自己处理线程容易得多。
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();