从多个线程向IProgress报告以错误的顺序返回消息

时间:2018-05-05 13:11:44

标签: c# multithreading progress

我想知道如何从多个线程使用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循环中移动打印?

0 个答案:

没有答案