C# 异步绘制datagridview

C# 异步绘制datagridview,c#,winforms,datagridview,C#,Winforms,Datagridview,我需要在主线程上绘制datagridview。我正在处理的数据来自通常包含数千条记录的大型excel文件。 当我验证错误检查和绘制时,它会阻塞主UI,显示应用程序没有响应,并且在完成之前不会刷新进度条 我在使用后台工作程序时没有这样的问题,但是由于需要在主线程上绘制datagrid和添加listview项,所以这种方法不起作用 我同意它在主线程上运行,但我希望它显示进度条,而不是没有响应 我对异步编程和Control.Invoke相当陌生。我该怎么处理 Control.Invoke在主线程中执行

我需要在主线程上绘制datagridview。我正在处理的数据来自通常包含数千条记录的大型excel文件。 当我验证错误检查和绘制时,它会阻塞主UI,显示应用程序没有响应,并且在完成之前不会刷新进度条

我在使用后台工作程序时没有这样的问题,但是由于需要在主线程上绘制datagrid和添加listview项,所以这种方法不起作用

我同意它在主线程上运行,但我希望它显示进度条,而不是没有响应

我对异步编程和Control.Invoke相当陌生。我该怎么处理

Control.Invoke在主线程中执行您不想要的代码


您必须在中使用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。

您不能将验证和加载拆分到datagridview流程中吗?这样验证就可以在后台线程中完成。您也可以在后台将所有内容加载到数据集中,然后让datagridview在完成所有内容后加载该数据。这是我的方法,但这是浪费—在excel文件上进行迭代,列出有错误的行,然后再次迭代以添加listviewitems并绘制网格。