可以预先取消Windows消息循环吗?

时间:2010-10-25 14:28:50

标签: c# .net wpf windows message-queue

我有一个wpf应用程序,它通过将可观察集合绑定到网格的常用方法填充Infragistics XamDataGrid。当每个数据项一次填充到集合中时,网格会更新。我还有一个取消按钮,如果用户点击它,我想立即停止播放。但是,响应取消需要几秒钟或更长时间。

问题(我认为)是消息循环充满了网格填充事件,我的取消在后面,必须等待轮到它。我想知道是否有办法在队列前面插入一条消息,从而使取消更具响应性(hacky与否 - 如果hacky,请解释我可以预期的不良影响)。

我没有遇到糟糕的表现;事实上,用户界面非常敏感。问题纯粹是取消事件必须在消息队列中轮流等待,我宁愿它优先于人口消息。

编辑:澄清

2 个答案:

答案 0 :(得分:1)

当你说网格时,你的意思是什么样的网格?我认为您的问题可能是对于大型集合,此设置可能不会使用任何类型的项目虚拟化。在这种情况下,最好使用ListBox或ListView,它可以使用VirtualizingStackPanel仅为屏幕上的项目生成UIElements。

如果是这种情况,你的ui线程就会陷入困境,因为它为每个新项目生成元素,无论它是否显示在屏幕上。如果您使用的是第三方网格,则可以检查它是否具有内置的可以打开的虚拟化功能。

答案 1 :(得分:1)

答案最终成为DispatcherPriority:

 private void btnCancel_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            Dispatcher.Invoke(new Action(() => btnCancel.Command.Execute(null)), DispatcherPriority.Send);
        }

“发送”优先级是枚举类型中最高的,“SystemIdle”最低。当我使用该优先级调用按钮的命令时,取消会立即通过。