繁体   English   中英

如何从不同线程在主线程中运行一段代码?

[英]How can I run a piece of code in the main thread from a different thread?

我正在使用HttpListener类作为Web服务器。 该服务器在其他线程上运行。 在某些时候,该服务器需要运行一些代码,但是需要在主线程上执行。 有一个简单的方法吗?

谢谢!

更大的问题是:

为什么需要在父线程上运行它? 是UI代码修改UI吗? 您是否需要在该线程的上下文中才能保证线程安全?

可能值得退后一步,重新评估线程模型,您可能试图在错误的地方做事。

我建议您阅读有关C#线程的这本出色的免费电子书,并了解线程间通信的替代方法,如果您使用的是WPF,请研究Dispatcher ,因为这将有助于将事件委托回UI线程。你的意图是。

快速与肮脏的解决方案并非最佳方法

有许多方法可以解决此问题,最简单的方法可能是在主线程上执行一组委托。 每次主线程旋转时,您都将锁定该集合(除非您使用的是多线程集合),然后复制出委托并清除该集合并释放锁。

然后,您只需在主线程上运行它们。

您将遇到的问题是,如果在主线程上使用阻塞,则直到阻塞停止,旋转周期才不会传递给委托。 因此,如果您说在等待连接时阻塞,那么直到有新人员连接时,您的代码才会运行。

您可以将服务器的监听端口放在它自己的线程上以解决此问题。

要在主线程上执行某些操作,您可能需要通过Invoke()进行注入,否则在主循环中将有一些工作要做的事情将从“其他”线程(在本例中为HttpListener注入。

您的示例似乎与我的示例相似,在该示例中,我有300个线程正在处理流翻录,并且它们都通过将字符串消息放入队列中来“调用”主线程。 它像一种魅力。 但是,当我尝试(我胆敢,只是想知道会发生什么Invoke()从至少30个线程到主消息循环Invoke()时,至少可以说这很奇怪。

最好:使用简单的Queue< something > ,从另一个线程入队,然后从UI线程出队。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM