c# – 在BackgroundWorker中休眠的线程

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

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

    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 ms实际上会使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;
    }
点赞