调度程序和集合绑定到UI

时间:2012-10-15 14:58:26

标签: c# wpf multithreading dispatcher

Dispatcher的烦恼,希望有些人知道解决方法。

问题: 任何UI元素或任何绑定到它们的东西都是 FORCED / Required 到Dispatcher线程上。 然后根据操作导致挂起时间。 我有一个绑定到UI元素的集合,并且操作不能在不同的线程上,因此挂起时间迫在眉睫。

解决这个问题的方法是什么?

请不要回复Dispatcher.Invoke或任何相关类型,因为它们不起作用。因为它们是同步的。现在,我所能做的就是尽可能快地优化操作,但实际上是有限的。

1 个答案:

答案 0 :(得分:3)

虽然你正在做的一些工作需要在UI线程中,但它的所有却没有。如果要将数据绑定到控件,则应确保数据全部在后台线程中计算,然后UI线程中发生的唯一操作是将已获取/计算的数据应用于控件。例如,如果您使用IQueryable框架并将IQueryable查询的结果绑定为数据源,那么该查询的结果尚未实际评估过;由于未迭代结果,因此实际上未查询数据库。这样做会导致UI线程进行数据库调用,这是一件坏事。在这样的示例中,最好将查询结果拉入List,然后在UI线程中绑定列表。

如果你真的有这么多的数据,你真的花了很长时间来更新所有的控件,尽管你没有做我所描述的任何事情,那么你可能需要从根本上重新设计您的应用程序。如果您确实如此,则必须将数千行数据绑定到DataGrid(或沿着这些行的某些内容)。您可能需要对数据进行分页,或者沿着这些行执行其他操作,以确保实际上不会将那么多数据实际应用于您的控件。你需要找到一些方法将事情分解成更小的数据块,然后显示那些较小的数据块。