如何在 C# 的循环外访问 Parallel ForEach 中的变量集?

How can I access a variable set in Parallel ForEach outside the loop in C#?

RunQuestion 是一种使用 Parallel.ForEach 循环将读取的字符附加到 StringBuilder 变量 (builder) 的方法。并行循环包含在一个每 10 秒触发一次的计时器中,这样我就可以查看构建器变量的内容,了解已处理了多少数据。问题是每当计时器触发时,传递给 DisplayOutput 的构建器始终为空白。 我正在寻找一种方法来获取并行 for 循环以更新传递给 DisplayOutput 的构建器对象。

    public Task RunQuestion(ICharacterReader[] readers, IOutputResult output)
    {
        var wordsFrequency = new Dictionary<string, int>();
        var builder = new StringBuilder();
        var objLock = new object();

        try
        {
            var reportPeriod = TimeSpan.FromSeconds(10);
            using (new Timer(_ => DisplayOutput(builder), null, reportPeriod, reportPeriod))
            {
                Parallel.ForEach(readers, reader =>
                {
                    var stream = ReadStream(reader);
                    lock (objLock)
                        {
                            builder.Append(stream);
                        }
                });
            }

            wordsFrequency = GetWordsFrequency(builder);
        }
        catch (Exception ex)
        {
            throw;
        }

        return Task.FromResult(0);
    }

    private void DisplayOutput(StringBuilder builder)
    {
        foreach (var item in GetWordsFrequency(builder))
        {
            Debug.WriteLine($"{item.Key} - {item.Key}");
        }
    }

除了监控 StringBuilder 和报告状态的 parallel.foreach,您必须创建一个不同的线程。