【发布时间】:2018-03-02 00:32:14
【问题描述】:
我正在尝试向 ConcurrentBag 添加多个值,但实际上没有值进入其中。起初我尝试使用 List,但这显然不是“线程安全的”,所以我四处搜索,似乎人们建议使用 ConcurrentBag。我尝试将 Thread.Sleep(100) 与 List 一起使用,并且有效,但速度较慢。如何正确添加值?调试器总是显示“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();
}
【问题讨论】:
-
test_Type的值是多少?如果您在bagOfExercises.Add行上放置断点,它们会被命中吗?如果您在break;行上放置断点,它们会被命中吗? -
有什么问题?
-
凯文,我在问如何正确地为包添加价值。 test_Type 是一个字符串。调试时没有值被添加到包中,它只是保持在 0。
-
您正在为每个条目启动一个线程......然后您无需等待其中任何一个完成。难怪它现在超级快而且你没有得到结果。我会说再试一次
Parallel.ForEach -
如果你不等待他们完成......你不会得到结果。我从来没有说过你应该按顺序等待每一个,但在某一时刻你将不得不等待所有。如果你不......你没有结果。再说一遍:线程有点难,我建议你再试一次
Parallel.ForEach。或者甚至可能来自 Plinq 的.AsParallel()。这比自己处理线程要容易得多。
标签: c# multithreading list