如何在 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,您必须创建一个不同的线程。
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,您必须创建一个不同的线程。