c# - 线程在 BackgroundWorker 中休眠

标签 c# wpf multithreading backgroundworker thread-sleep

我编写了一个简单的应用程序,使用 BackgroundWorker 将 100000 行“Hello World”添加到列表中。

下面是我的 backgroundworker 在一个单独的线程中所做的工作的代码:

    private void BgWorkerOnDoWork(object sender, DoWorkEventArgs doWorkEventArgs)
    {
        int min = 0;

        foreach (var hw in hwList)
        {
            //new ManualResetEvent(false).WaitOne(1);
            Thread.Sleep(1);
            int progress = Convert.ToInt32((Double)min / hwList.Count * 100);
            min++;
            bgWorker.ReportProgress(progress);
        }
    }

    // Updating the progress
    private void BgWorkerOnProgressChanged(object sender, ProgressChangedEventArgs progressChangedEventArgs)
    {
        ProgressBar.Value = progressChangedEventArgs.ProgressPercentage;
    }

一切正常,除了如果我删除 Thread.Sleep(1) BackgroundWorker 不再报告进度。 (我想这需要一些时间)。将线程挂起 1 毫秒实际上会使 BackgroundWorker 报告进度,但速度非常慢。

我的问题是,有没有一种方法可以摆脱线程休眠,同时让 BackgroundWorker 正确报告进度?

根据我的理解,暂停 BackgroundWorker 是不可避免的,因为线程需要一些时间来执行任务,但我想知道是否有解决方法。

最佳答案

我遇到了经常报告进度的问题,而且没有理由多次报告相同的进度浪费 CPU 周期。

 private void BgWorkerOnDoWork(object sender, DoWorkEventArgs doWorkEventArgs)
    {
        int min = 0;
        int oldProgress = 0;
        foreach (var hw in hwList)
        {
            // new ManualResetEvent(false).WaitOne(1);
            // Thread.Sleep(1);
            int progress = Convert.ToInt32((Double)min / hwList.Count * 100);
            min++;

            // Only report progress when it changes
            if(progress != oldProgress){
                 bgWorker.ReportProgress(progress);
                 oldProgress = progress;
            }
        }
    }

    // Updating the progress
    private void BgWorkerOnProgressChanged(object sender, ProgressChangedEventArgs progressChangedEventArgs)
    {
        ProgressBar.Value = progressChangedEventArgs.ProgressPercentage;
    }

关于c# - 线程在 BackgroundWorker 中休眠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30765897/

相关文章:

c# - 在遍历表达式时提取实例变量的当前值

wpf - 为什么 WPF 中不包含 AutoScaleMode 属性?

c# - 属性更新后调用任务

java - 使用 EasyMock 测试简单的多线程代码,但得到了奇怪的结果

python - 停止运行无限循环的 python 线程

c# - 调用有错误的存储过程,继续并获取完整输出

c# - 如何在 page_load VB.net 之前加载客户端

c# - 如何保存 Accord.Net K-Means 的聚类结果以供重复使用?

wpf - 在 WPF 全屏应用程序中禁止虚拟触摸屏 Windows 键盘

c++ - 在线程之间 move vector