在等待WaitHandle时运行Message Loop

时间:2009-06-03 19:40:30

标签: c# .net multithreading waithandle message-loop

当UI线程在WaitHandle或其他线程原语上等待时,有没有办法处理所有Windows消息?

我意识到它可能会造成非常混乱的重入问题;无论如何我想要这样做。

编辑:等待发生在必须在UI线程上运行的复杂函数的中间。因此,将等待移动到后台线程不是一种选择。 (将函数拆分为两个会造成复杂且难以维护的混乱)

4 个答案:

答案 0 :(得分:4)

我在一个单独的后台线程中运行整个“复杂功能 - 不可分裂”,并让它仅在需要时向GUI报告(使用Invoke / BeginInvoke方法)控制)。

在更强大的版本中,您应该在不依赖于UI的非UI控制器中运行复杂的功能,并且更容易进行单元测试。通过使用UI来描述控制器提供的事件,可以轻松地回调用户界面并在UI中显示结果。

答案 1 :(得分:3)

为什么你不会产生另一个线程进行等待并让他在适当的时刻通过消息(或其他)通知UI线程?

这是在阻塞事件期间允许UI线程消息处理的常用方法。

编辑: 我现在看到了 - 你在UI代码中内置了app逻辑逻辑。那么,这真的是一个设计问题。从长远来看,您最好将该功能从UI转移到一个自包含的对象中,并使用某种机制与您的工作人员通过UI进行状态通信。

除了将UI代码集中在UI上的好处之外,这还允许您单独对单元进行单元测试。

答案 2 :(得分:2)

不确定C#,但在普通的Win32编程中,您可以使用其中一个MsgWaitFor ...()函数进行实际等待。当消息队列中存在消息时,以及等待的对象发出信号时,它将通知您。如果它报告存在消息,则可以调用GetMessage(),TranslateMessage()和DispatchMessage()来处理消息,然后返回等待。

答案 3 :(得分:2)

我通常建议你把等待条件放在另一个线程上。

然而,话虽如此,你总是可以随时调用Application.DoEvents来处理消息泵,包括在等待句柄上“等待”(只是超时,做事件,等待超时等),直到你得到了“通过”等待处理。)