当 UI 线程等待 WaitHandle 或其他线程原语时,是否有任何方法可以处理所有 Windows 消息?

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

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

有帮助吗?

解决方案

我运行整个“复杂功能 - 即灿不待拆分”在一个单独的后台线程,并且仅当它需要(关于使用调用/ BeginInvoke的方法它向GUI报告的控制)。

在更强的版本,你应该在不依赖于用户界面,并且更易于进行单元测试非UI控制器运行复杂的功能。调用返回到UI和表示在用户界面中的结果,可以容易地通过具有UI到subrscribe由控制器提供的事件到达。

其他提示

为什么你不只是产生另一个线程来执行的等待,让他在适当时候通知通过邮件(或其他)的UI线程?

这是通常的做法,以允许UI线程消息的阻塞事件期间处理。

编辑: 我现在看到的 - 你必须建立在UI代码的应用程序逻辑的逻辑。嗯,这的确是一个设计问题,然后。你最好在长期从UI到一个自包含的对象打破了功能,并在使用某种机制从你的工人的UI进行沟通状态。

除了保持集中在UI的UI代码的权益,这可以让你单元测试逻辑代码分开。

不知道关于C#,但在平原Win32编程,你可以使用MsgWaitFor之一... ...()对于实际的等待功能。它会通知你消息出现在消息队列中时,以及当对象(一个或多个)被等待上成为信号通知为。如果它报告的消息存在,则可以调用的GetMessage(),的TranslateMessage()和DispatchMessage函数()来处理的消息,并且然后返回到等待。

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

不过,话虽这么说,您随时可以致电 应用程序.DoEvents 在任何时候处理消息泵,包括在等待句柄上“等待”时(只是超时、执行事件、超时等待等,直到“通过”等待句柄)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top