【问题标题】:Add items to ConcurrentBag by multithreading通过多线程将项目添加到 ConcurrentBag
【发布时间】: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


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

【讨论】:

    猜你喜欢
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    相关资源
    最近更新 更多