我注意到,AutoResetEvent在WaitOne()调用过程中完全冻结了消息循环(有时),甚至有效地阻塞了信号消息。
IE:
有什么想法吗?
编辑:添加UI/T2以指定线程。另外,我正在尝试将第三方库转换为同步库。打开设备涉及一个Open()调用,这个调用反过来会产生一个OpenOK或OpenFailed事件,我正在尝试创建一个bool ()调用,根据生成的事件返回true/false。
发布于 2009-09-29 02:41:33
..。有效地阻断了信号信息。
您不能“阻止一个信号”被发送,您只能阻止另一个线程到达设置事件的点。等待句柄根本不需要消息泵。
我唯一能想到的可能是,所讨论的COM对象被绑定到UI线程。访问COM对象可能试图从T2调用回UI线程,该线程正在等待T2做一些事情(死锁)。要查看这是否确实是问题所在,请确保没有在UI线程上创建或访问COM对象。
发布于 2009-09-28 23:52:57
这是比赛条件的结果。问题是,步骤3可能发生在步骤2之前,因为它们位于不同的线程上。因为您使用的是AutoResetEvent,所以在调用WaitOne时,事件已经被重置。
由于这个问题,只要有可能,我通常都会尽量避免使用AutoResetEvents来支持ManualResetEvents。
使用ManualResetEvent的事件顺序是(我已经将事件2列为2a和2b,以证明它们的操作顺序没有得到保证):
发布于 2009-09-29 01:19:52
您可能会发现这,所以在“等待主线程同时继续处理”上发布
还签出了MSDN的异步调用同步方法
https://stackoverflow.com/questions/1489859
复制相似问题