在 WinForms 中,您有Control.BeginInvoke()
,这意味着您可以将后台线程的调用编组到创建控件句柄的主 UI 线程。
这很好,但是(在 C# 中)如何在两个“标准”线程之间执行此操作?
我编写了一个服务总线,它有一个处理器线程来消费消息。我想要一个计时器触发,这会导致处理器线程执行某些操作,而不是在计时器线程中运行的代码。
当然我可以使用线程同步(Monitor
/using() {...}
)但想知道它是如何正常完成的。
不幸的是,这里很难给出答案,因为它高度依赖于线程的性质。
线程之间的封送处理并不神奇。有一个潜在的机制可以做到这一点。例如,在 WinForms 中,Control.Invoke 样式函数通过消息传递来工作。有一条消息发布到 UI 线程,消息泵最终会泵送该消息并将其转换为 Marshal'd 调用。
为了编组标准线程之间的调用,它必须具有某种功能,可以通过该功能检测要发生的编组调用,然后使该调用发生。这通常是通过某种消息传递来完成的。
恕我直言,最标准的方法是让您的线程实现、提供并安装 SynchronizationContext。这是定义线程之间封送处理机制的更标准方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)