[英]How can I decouple this C# worker thread code from the main thread for shared data variables?
[英]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.