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}");
}
}