c# - 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 冻结。
解决方案
Hans Passant 上面的评论是正确的提示。在我调用的方法中,.ReportProgress
在一些循环中实现了很多,并且 UI 线程似乎无法跟上这一点(虽然没有触发异常)。在调试模式下运行程序时,由于某种原因,程序运行速度要慢得多,然后 UI 线程似乎没有这个问题。
推荐阅读
- python - 在while循环中调用函数内的变量
- c# - WPF - 以毫米为单位的鼠标坐标
- python - 使用 Pyodbc 在 MS Access 表中写入新行的问题
- cherrypy - CherryPy 在我播放 HTML 视频元素后自杀
- .net-core - SPFX(团队),代表后端的图形 API
- java - 序列化,编译时检查与运行时检查
- jquery - 光滑的滑块在断点后打破自动播放顺序中断
- java - 如何在java中比较同一个arraylist中的2个集合值
- raspberry-pi - RASPi 4B:如何从 OpenOCD/JTag 加载和运行 kernel8.img?
- python - 如果第一行为 0,则从 DataFrame 中选择列