【发布时间】:2010-12-02 04:04:49
【问题描述】:
我注意到 AutoResetEvent 在 WaitOne() 调用过程中(有时)完全冻结了消息循环,甚至有效地阻止了信号消息。
IE:
- (UI)新线程产生
- (UI) 代码调用 WaitOne();超时:10s
- (T2) 线程打开设备,调用 Set()
- (UI) WaitOne 阻止消息循环
- (UI) WaitOne 超时,代码继续执行
- (UI)主窗口接收信号并继续(但 WaitOne 失败)
有什么想法吗?
编辑:添加 UI/T2 以指定线程。另外,我正在尝试将第 3 方库变为同步。打开设备涉及一个 Open() 调用,该调用反过来产生一个 OpenOK 或 OpenFailed 事件,我正在尝试进行一个 bool Open() 调用,该调用根据产生的事件返回 true/false。
【问题讨论】:
-
您能否在上述步骤中添加每个操作在哪个线程上运行的前缀(可能使用 UI、T1、T2 等)。在你的描述中很难理解哪个线程是哪个线程。
-
另外,如果你愿意,你可以在创建它时将 AutoResetEvent 的状态设置为发出信号,这样你就不会在第一次调用时超时(如果你想要的话)-> AutoResetEvent e = AutoResetEvent(true);
-
定义“打开设备”。您可能希望确保打开设备不依赖于消息循环正在处理的任何消息。
-
不,只有 COM 事件。其余的只是硬件。
标签: c# com multithreading message-loop