Как я могу получить доступ к переменной, установленной в Parallel ForEach за пределами l oop in C#? - PullRequest
0 голосов
/ 21 апреля 2020

RunQuestion - это метод, который использует Parallel.ForEach l oop для добавления прочитанных символов в переменную StringBuilder (builder). Параллель l oop обернута в таймер, который срабатывает каждые 10 секунд, так что я могу посмотреть на содержимое переменной построителя, чтобы выяснить, сколько данных было обработано. Проблема в том, что построитель, передаваемый в DisplayOutput, всегда пуст при каждом срабатывании таймера. Я ищу способ получить параллель для l oop для обновления объекта построителя, переданного в 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}");
        }
    }

1 Ответ

0 голосов
/ 22 апреля 2020

Вам нужно будет создать другой поток, отличный от параллельного. Foreach, который отслеживает StringBuilder и сообщает о состоянии.

...