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

时间:2011-02-15 23:11:13

标签: c# multithreading

我使用HttpListener类作为Web服务器。此服务器在不同的线程上运行。 在某些时候,这个服务器需要运行一些代码,但它需要在主线程上执行。这样做有简单的方法吗?

谢谢!

2 个答案:

答案 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线程中出列。