C# 手动将其连接到线程
在WinForms中,您有C# 手动将其连接到线程,c#,multithreading,C#,Multithreading,在WinForms中,您有Control.BeginInvoke(),这意味着您可以对后台线程到创建控件句柄的主UI线程的调用进行封送处理 这很好,但是(在C#中)如何在两个“标准”线程之间执行此操作 我已经编写了一个服务总线,它有一个处理器线程来使用消息。我希望启动一个计时器,这会导致处理器线程执行某些操作,而不是计时器线程中运行的代码 当然,我可以使用线程同步(Monitor/using(){…}),但我想知道它是如何正常完成的。Windows窗体运行一个线程,这就是为什么您可以将各种任务马
Control.BeginInvoke()
,这意味着您可以对后台线程到创建控件句柄的主UI线程的调用进行封送处理
这很好,但是(在C#中)如何在两个“标准”线程之间执行此操作
我已经编写了一个服务总线,它有一个处理器线程来使用消息。我希望启动一个计时器,这会导致处理器线程执行某些操作,而不是计时器线程中运行的代码
当然,我可以使用线程同步(Monitor
/using(){…}
),但我想知道它是如何正常完成的。Windows窗体运行一个线程,这就是为什么您可以将各种任务马歇尔到UI线程的原因-它会在队列中重复查找消息,这些消息可以跨线程边界发送
如果要手动执行,可以创建自己的消息循环(用于一个或多个线程),或者使用更简单的同步原语。对于这种情况似乎是合适的。您只需要在正确的位置调用
Set
和WaitOne
方法(当然要注意死锁)。不幸的是,这里很难给出答案,因为它高度依赖于线程的性质
线程之间的封送不是魔法。有一种潜在的机制使之成为可能。例如,在WinForms中,Control.Invoke样式函数通过消息传递工作。有一条消息发布到UI线程,消息泵最终将泵送该消息并将其转换为封送调用
为了在标准线程之间封送一个调用,它必须具有某种能力,通过这种能力,它可以检测想要发生的封送调用,然后使该调用发生。这通常通过某种类型的消息传递来完成
依我看,最标准的方法是让线程实现、提供和安装SynchronizationContext。这是在线程之间定义封送机制的更标准的方法 SynchronizationContext是我想要的答案-谢谢!