我需要在主线程上绘制一个datagridview。我处理的数据来自通常包含数千条记录的大型Excel文件。 当我验证(检查错误和绘画)时,它会阻止主UI,显示"应用程序没有响应"并且不会刷新进度条直到它完成。
我在使用后台工作程序时没有这样的问题,但是因为它需要绘制datagrid&&在主线程上添加listview项目这种方法不起作用。
我在主线程上运行时运行正常,但我希望它能显示进度条而不会无响应。
我对异步编程和Control.Invoke()相当新。我该怎么处理?
答案 0 :(得分:0)
Control.Invoke()
在主线程中执行代码(正是你不想要的)。
您必须在VirtualMode
中使用DataGridView
。在此模式下,仅绘制可见单元格,以便在DataGridView
中包含大量数据。
答案 1 :(得分:0)
我最终在每次迭代中使用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。