我想知道如何从多个线程使用Progress类,这样报告顺序就不会搞砸,报告实际上会定期进行。我有以下代码:
int finished = 0;
object finLocker = new object();
try
{
Parallel.For(0, size, (int step) => {
//DO STUFF
cancellationToken.ThrowIfCancellationRequested();
lock (finLocker)
{
finished++;
if (finished % 5000000 == 0)
{
progress.Report($"Progress report { (int)(100 * ((double)finished / (double)size)) }%");
}
}
});
}
然后将进展定义为:
IProgress<String> progress = new Progress<String>((String s) =>
{
Debug.WriteLine(s);
});
问题是,大部分时间,我首先得到17%,然后有一个~2秒的长延迟,然后34%,52%,69%和87%同时出现错误顺序。
我认为问题在于,即使正确调用progress.Report,管理打印的主线程也会在大多数时间暂停(这不是一件坏事,因为它在For循环中什么都不做正在执行) - 但同时它使进度无法使用。有没有办法解决这个问题,最好不要删除Progress类并在For循环中移动打印?