首页 > 解决方案 > BackgroundWorker 仅在调试模式下报告进度

问题描述

我有一个程序可以读取一些数据,然后基于此创建一个大数据表,最后将此数据表导出到一个 .csv 文件。由于表格的生成需要很长时间,我创建了一个后台工作程序,它应该显示在我的主窗体上的一个列表框中,该程序正在处理中。

下面是我的代码摘要:

    private readonly BackgroundWorker worker = new BackgroundWorker();

    public void get_data()
    {
        worker.DoWork += worker_DoWork;
        worker.RunWorkerCompleted += worker_RunWorkerCompleted;
        worker.ProgressChanged += worker_ProgressChanged;
        worker.WorkerReportsProgress = true;
        worker.RunWorkerAsync();

    }

    private void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        worker.ReportProgress(1, "Starting");

        mydata = read_file();

        worker.ReportProgress(1, "Step 1 done!");

        fullmodel = combine_data(mydata);

        worker.ReportProgress(1, "Step 2 done!");

        DataTableToCSV(fullmodel, ';');

    }

    private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {

        MainWindow.listBox.Items.Add(e.UserState);      

    }

    private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    { 

    }

当我在 VS2015 的调试模式下运行我的程序时,这工作正常,“开始”,“第 1 步完成!” 和“第 2 步完成!” 应该出现在列表框中。但是,当我在 Visual Studio 之外运行应用程序时,ProgressChanged 事件似乎只被触发一次——“正在启动”按预期显示在列表框中,但只有在后台工作人员完成时,其他两个条目应该在它运行时报告running 立即显示在列表框中,并且在程序运行时 UI 冻结。

标签: c#wpfbackgroundworker

解决方案


Hans Passant 上面的评论是正确的提示。在我调用的方法中,.ReportProgress在一些循环中实现了很多,并且 UI 线程似乎无法跟上这一点(虽然没有触发异常)。在调试模式下运行程序时,由于某种原因,程序运行速度要慢得多,然后 UI 线程似乎没有这个问题。


推荐阅读