1

我正在使用 DataGridView 和一些我确实导致它在一段时间内无响应的操作。通常我会将数据处理放在它自己的线程中,以使表单更具响应性,但在这种情况下,DataGridView 本身需要很长时间。

这让我想知道是否可以将主窗体放在一个线程上,将 DataGridView 放在另一个线程上,这样它就不会阻止主窗体响应。

我完全理解这样做可能并不“安全”,并且可能会打开一罐蠕虫,这使得它几乎不值得尝试,我完全希望这篇文章仅仅因为提出这样一个荒谬的想法而被否决。

这可能吗?如果是这样,你会怎么做?

编辑:我想出了如何解决手头的问题。简短的回答是在设置 RowCount 时使用一个标志,以便 CellValueNeeded() 可以立即退出。这个故事还有更多内容,我已经部分地做了这件事,但这就是它的要点。

4

4 回答 4

4

简短的回答是否定的,因为控件需要与其他控件(或至少是窗口)交互,并且它们都需要在同一个线程上。

这样做似乎意味着您正在 UI 线程上进行处理,这本身也是一个很大的禁忌。您应该在各自的线程上运行所有主要进程,然后为 UI 线程保存最终演示文稿——在一个线程上工作,在另一个线程上进行屏幕更新。

于 2013-11-07T21:52:04.133 回答
1

在给定的应用程序中绝对可以有多个 UI 线程。但是,不可能将来自不同线程的 UI 组件组合到同一个表单上。对于给定的表单,所有组件必须在同一个线程上

解决此问题的最佳方法是将数据处理本身移到单独的线程上。只做绝对最小的从 UI 线程更新 UI。这应该有助于响应能力

于 2013-11-07T21:53:38.953 回答
0

看看在网格中使用虚拟化。

并且请给代码示例什么操作花费太长时间!

于 2013-11-07T21:54:56.787 回答
0

不,但是从 dataGridView 触发的事件中,您可以发送一个工作人员来执行异步任务,然后使用来自工作线程的控件 Invoke 方法更新 dataGridView

于 2013-11-07T22:00:11.730 回答