保持UI线程免费

时间:2009-02-09 16:40:42

标签: c# winforms

我有一个带有两个面板(顶部,底部)的表单,每个面板都包含网格。基本上,它是一个Master-Detail表单,从顶部网格中选择一行将显示底部网格中的详细信息。

将数据绑定到详细信息网格需要一些时间。由于绑定是在UI线程上完成的,因此它会阻塞线程,因此在完成绑定之前,用户无法从主网格中选择另一行。

请注意,通过绑定我并不是指从数据源获取数据。实际的绑定需要更长的时间,因为它会进行大量的数据按摩。当细节网格正在进行绑定时,如何保持UI线程自由?

万分感谢。

4 个答案:

答案 0 :(得分:1)

你做不到。必须在UI线程上执行UI的更新。

您可以通过使用某些控件上可用的BeginUpdate / EndUpdate之类的东西来加速绑定,但是由于您没有指定您正在使用的内容,我不能说它是否可用。

答案 1 :(得分:0)

您可以使用后台线程执行数据检索,然后使用UI线程显示它。

答案 2 :(得分:0)

如果我是你,听起来你正在处理大量数据,我会把所有“按摩”分开到一个单独的线程过程中。

因此,例如,当创建主记录时,您“手动”将后台线程中的详细数据分离到另一个数据集并进行按摩,然后将结果数据集绑定到网格。这样,在UI线程上发生的唯一事情就是UI绑定。

最终,如果花费这么长时间,您可能正在接近应用程序中的关键点,您需要在代码中手动执行您需要执行的操作,而不是使用.NET中现成的数据绑定功能。

答案 3 :(得分:0)

最后我找到了解决方案。该解决方案不包括多线程。正如我所说,延迟是绑定网格意味着主线程被搁置,我们做不了多少。因此解决方案是带来延迟。当用户选择主行时,计时器会在一段时间内关闭。如果在时间到期之前发出了另一个请求,则重新启动计时器。这是因为用户单击或选择行太快而忽略所有调用。一旦计时器到期,我将选择所选行并显示数据。简单而优雅的解决方案。