我需要在主线程上绘制一个数据网格视图。我正在处理的数据来自大型excel文件,这些文件通常包含数千条记录。当我验证(检查错误并绘制)时,它会阻塞主UI,显示"应用程序没有响应",并且在完成之前不会刷新进度条。
我在使用后台工作者时没有这样的问题,但由于它需要绘制数据网格&;在主线程上添加listview项这种方法不起作用。
我同意它在主线程上运行,但我希望它显示进度条,而不是变得没有响应。
我对异步编程和Control.Invoke()还很陌生。我应该如何处理这个问题?
Control.Invoke()
在主线程中执行代码(这正是您不想要的)。
您必须在VirtualMode
中使用您的DataGridView
。在这种模式下,只绘制可见的单元格,因此DataGridView
中可以有大量数据。
我最终在每次迭代中使用Application.DoEvents(),在必要时调用绘画,将Form.DoubleBuffered设置为true并使用此:
[System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
public static extern int SendMessage(IntPtr hWnd, Int32 wMsg, bool wParam, Int32 lParam);
private const int WM_SETREDRAW = 11;
停止/启动datagridview的绘制,并最终在最后调用refresh(),有效地为我节省了80%的验证过程时间。
不过,我强烈建议使用backgroundWorker。