2013-03-05 42 views
2

我已经阅读了关于WPF中的Dispatcher的文章,但没有一篇真的很好地解释Dispatcher的行为。所以我对你们的问题是Dispatcher究竟做了什么,除了保留一个任务队列并按他们的优先级执行它们之外呢?队列看起来是什么样子?如果我按优先级“正常”顺序放置3个任务,然后优先“发送”一个任务。哪个会先执行? 3个优先级正常的任务按照什么顺序执行?有关于Dispatcher的一些非常好的教程,或者你们想分享的一些概念证明吗?调度员窘境 - 如何正确调度?

回答

3

Dispatcher实际上只是WPF应用程序的消息泵。

与传统的Windows消息泵不同,它具有内置的优先级,所以它的行为类似于priority queue而不是传统的(先进先出)队列。

如果您发送优先级为Send的消息,它将在其他优先级(如Normal)的其他操作之前得到处理。您可以在DispatcherPriority帮助中查看优先级列表及其值。优先级较高的消息始终在低优先级消息之前处理(尚未处理)。

至于你具体的问题:

所以我给你们的问题是什么做调度员除了准确保持的任务队列,并通过它们的优先级执行呢?

它处理Windows消息并对其进行处理,就像传统的Win32或Windows Forms应用程序中的常规Windows消息泵一样。优先队列是为了处理除标准窗口消息之外的用户消息而建立的,具有内置的优先级。

队列看起来是什么样子?

这是一个有效的优先级队列。

如果我按照优先级“正常”顺序放置3个任务,然后再优先“发送”一个任务。哪个会先执行?

这取决于。如果此时正在进行其他工作,则Send任务将首先处理。如果没有其他工作正在发生,则在您提交Send任务之前可能会执行Normal任务,在这种情况下,订单将发生更改。但是,Send任务将尽快执行。

在什么样的顺序将优先正常的3个任务被执行?

这些将按照它们被调度的相同顺序执行。

+0

谢谢你Reed Copsey。我还有一个问题要问你。什么是ContextLayoutManager。这似乎是像调度员或使用WPF中的分派器的东西。此外,如果我将调度程序调用为BeginInvoke(..)优先级为“normal”的方法,并且该方法为this.InvalidateMeasure()。只有将度量脏标志设置为真的InvalidateMeasure()才会被执行,而不会实际测量(),或者会将InvalidateMeasure()和measure()组合到同一个任务中,并且会与普通优先级一起执行? – 2013-03-05 17:33:32

+0

@hedgehog - 对于评论来说有点多(真正全新的问题) - ContextLayoutManager是一个用于处理布局问题的内部类。如果您调度'InvalidateMeasure()',它只会在该“任务”中失效 - 实际的度量消息将在稍后发生。 – 2013-03-05 17:36:41

+0

我已经测试过了。似乎InvalidateMeasure()和measure()将被合并为一个并一起执行。我不知道这是为什么。此外,我想打开一个新的聊天来讨论ContextLayoutManager,只是我不知道如何创建一个新的聊天频道。 – 2013-03-05 17:39:08