我使用HttpListener类作为Web服务器。此服务器在不同的线程上运行。 在某些时候,这个服务器需要运行一些代码,但它需要在主线程上执行。这样做有简单的方法吗?
谢谢!
答案 0 :(得分:4)
更大的问题是:
为什么需要在父线程上运行它?是UI代码修改UI吗?你需要在该线程的上下文中进行gaurantee线程安全吗?
可能值得退一步并重新评估您的线程模型,您可能会尝试在错误的位置执行操作。
我建议您阅读This Excelent Free E-Book on C# Threading并了解线程间通信的替代方法,如果您正在使用WPF,请查看Dispatcher
,因为它有助于将事件委托回UI线程如果这就是你的意图。
快速&肮脏的解决方案不是最好的方式
有很多方法可以解决这个问题,最简单的方法可能是在主线程上执行一个委托列表。每次主线程旋转时,都会锁定集合(除非您使用多线程集合)并复制代理和&清除收集并释放锁。
然后你只需在主线程上运行它们。
你遇到的问题是如果你在主线程上使用阻塞,你的旋转周期将无法通过你的代表直到你的阻塞停止。因此,如果您在等待连接时说阻塞,则在新人连接之前,您的代码将无法运行。
你可以把服务器的监听端口放在它自己的线程上来解决这个问题。
答案 1 :(得分:0)
要在主线程上执行某些操作,您可能希望通过Invoke()
注入它,或者在主循环中将有一些要从“其他”线程注入的事情队列,这种情况HttpListener
。
您的示例与我的示例类似,我有300个线程处理流翻录,并且它们都是通过将字符串消息放入队列中来“调用”主线程。它就像一个魅力。但是,当我尝试(我敢,只是为了看看会发生什么)从Invoke()
从至少30个线程到主消息循环时,至少可以说是奇怪的。
最佳:使用简单的Queue< something >
,并将其从其他线程入队,然后将其从UI线程中出列。