在阅读dispatcher类的文档之后,我意识到它也可以用于非UI行为的排队。
那么dispatcher类是如何工作的呢? 我意识到这一点,主要的工作是排列行动到一个特定的线程 – 但它是如何“发送”这些行动的线程? 线程如何“获取”这些操作?
我最好的猜测是每个线程都有一些“线程队列”,但是我再也不知道了。
Windows批处理脚本中的文件/文件夹select器对话框
如何给程序更多的权限,比用户启动它
使用windbgdebugging.NET转储
C# – 文件path的正则expression式,例如C: test test.exe
如何在.NET中执行应用程序内通信
无法以recursion方式删除用户文件夹中的文件夹。 在mscorlib.dll中发生“System.UnauthorizedAccessException”
.NET EXE和DLL之间的堆栈/堆区别
.NET WPF记住会话之间的窗口大小
什么shell动词用于双击行动?
让一个线程开始执行代码到另一个线程并不是一件容易的事情。 问题的症结在于,在线程已经启动之后,你不能简单地告诉任何线程开始执行一个方法。 目标线程必须专门设置以提前接收这些请求。
通常使用的模式是生产者 – 消费者。 目标线程将围绕无限循环旋转,等待消息出现在阻塞队列中。 队列被设计为阻塞,直到一个项目出现在队列中,从而防止目标线程不必要地占用cpu时间。 这是一个非常简单的方法来让一个线程接受一个委托注入执行。
public class Example { private BlockingCollection<Action> queue = new BlockingCollection<Action>(); public Example() { new Thread( () => { while (true) { Action action = queue.Take(); action(); } }).Start(); } public void ExecuteAsync(Action action) { queue.Add(action); } }
现在,在UI线程的情况下,它已经有一个消息循环运行,所以dispatcher类可以简单地发送一个特殊的消息到包含要执行的委托的消息队列。 在处理所有的绘画,按钮点击等过程中,这个特殊的消息也将被UI线程拾取,并且它将开始执行委托。
那么dispatcher类是如何工作的呢? 我意识到这一点,主要的工作是排列行动到一个特定的线程 – 但它是如何“发送”这些行动的线程?
通过将委托排队到目标线程监视的队列中。
线程如何“获取”这些操作?
通过运行监视队列的无限循环。 队列通常是一种特殊的类型,称为阻塞队列,如果队列为空则阻塞消耗线程。
我最好的猜测是每个线程都有一些“线程队列”,但是我再也不知道了。
八九不离十。 除了线程实际上没有一个内置的队列用于这个目的。 它必须手动设置。 这就是为什么只有专门设计的线程才能接受委托注入。 UI线程以这种方式设置,因为Application.Run创建消息循环。 在我的例子中,你会看到我不得不使用BlockingCollection和一个无限循环让它在一个工作线程上工作。
那么,显然dispatcher排队实现看起来像一个Win32消息泵,但它不(虽然它使用相同的User32消息和线程模型 )。
非常有趣的问题,但是你不需要一个Window有一个消息队列,这些都是单独的概念,你可以通过调用PeekMessage在任何线程上创建一个消息队列。
欲了解更多信息,请看这里
但是,这并不意味着没有窗口的调度程序是有用的。 我可以假设设计人员正在考虑一个独立的dispatcher对象,以便让它处理与应用程序一样多的窗口。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。