是否可以在自己的线程上放置一个表单控件?

时间:2013-11-07 21:48:51

标签: c# .net multithreading performance

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

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

我完全明白,这样做可能并不“安全”,并且可能会开辟一堆蠕虫,这使得它几乎不值得尝试。我完全相信这篇文章会因为仅仅提出这样一个荒谬的想法而获得投票。

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

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

4 个答案:

答案 0 :(得分:4)

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

这样做似乎意味着你正在对UI线程进行处理,这本身也是一个很大的禁忌。您应该在自己的线程上运行所有主要进程,然后为UI线程保存最终表示 - 在一个线程上工作,在另一个线程上进行屏幕更新。< / p>

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

了解网格中虚拟化的使用情况。

请将代码示例提供给操作时间过长的代码!

答案 3 :(得分:0)

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