【发布时间】:2012-07-10 15:55:13
【问题描述】:
我想我需要一些帮助来理解 Dispatcher Queue。
当新工作到达时,它会被添加到调度程序队列的开头,而当调度程序想要处理工作项时,它会从开头删除。
更一般地说:如果有工作,它会以先进先出的方式存储在队列中,并在没有工作时进行处理。
MSDN 文档here 指的是loop 和frame:
The Dispatcher processes the work item queue in a loop. The loop is referred to as a frame.
但是在这种情况下,循环在哪里?对我来说,循环是对某些东西进行迭代的东西,当它到达终点时,它会重新开始。
frame 的概念是什么?根据 MSDN 文档,一个框架是队列中工作项的一拳?如果是这样,应该如何使用静态方法Disptatcher.PushFrame()?
最有趣的问题是是否有任何方法可以获取队列的当前状态,尤其是队列中有多少项。
如果之前调用的方法(并因此放入 Dispatcher 队列)被执行,然后立即从队列中删除,或者它在内部持续一段时间,它是否成立?
我知道,有很多问题:-)
【问题讨论】:
-
第一个问题:为什么?为什么你想用 Dispatcher 做任何事情?通常,Dispatcher 只是 WPF 进程的“消息泵”。它通过 WPF UI 处理所有消息/事件/命令到应用程序代码(例如鼠标移动、单击等)。当调用应用程序 Run 方法时,它调用 PushFrame 以启动该循环。你不能为同一个线程启动另一个; Dispatcher 用于处理 UI 工作。
-
你读过threading model吗?
-
这是生产者-消费者问题的标准解决方案:en.wikipedia.org/wiki/Producer-consumer_problem
-
当调度程序从头开始添加/删除项目时,称为 LIFO。所以基本上它是一个堆栈。
-
“当新工作到达时,它会被添加到调度程序队列的开头”......那么它不是队列。你确定这不是错字吗?
标签: c# wpf asynchronous dispatcher method-invocation