异步绘制数据网格视图



我需要在主线程上绘制一个数据网格视图。我正在处理的数据来自大型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。

最新更新