我正在尝试做的是在我的进程内的一个窗口上捕获并等待一条WM_TIMER消息(尽管这是我无法控制的)。
我正在尝试使用AutoResetEvent来等待消息。
WaitForMaterialUpdate方法将NativeWindow连接到窗口,并在收到消息之前一直阻塞。
这是我使用的代码:
public class MaterialEditorWindow : NativeWindow
{
private const int WM_TIMER = 0x0113;
private AutoResetEvent waiter;
public void WaitForMaterialUpdate(IntPtr handle)
{
waiter = new AutoResetEvent(false);
AssignHandle(handle);
waiter.WaitOne(5000);
ReleaseHandle();
}
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_TIMER) waiter.Set();
base.WndProc(ref m);
}
}我所处的环境不是很容易调试,但我已经使用MessageBox确认窗口在等待期间实际上正在接收WM_TIMER消息,但是WaitOne总是在返回之前等待完整的5000毫秒超时周期。
你知道我哪里错了吗?
发布于 2013-01-01 00:49:28
WaitOne()是一个阻塞调用。
在WaitOne()返回之前,UI线程不会收到任何消息。由于是在UI线程收到消息时设置等待句柄,因此会出现死锁。
您需要在后台线程上执行此操作,或者在收到消息时简单地调用回调。
https://stackoverflow.com/questions/14103929
复制相似问题