我有一个连接到服务器的外部COM对象,然后在服务器准备就绪时触发事件。因此,connect()调用是异步的。
我的代码看起来(有点......)像
ManualResetEvent waitConnection;
//This is the event that is triggered when server is ready
public void onConnection_event(bool success)
{
if(success)
waitConnection.Set();
}
private string getItem(string itemName)
{
//MYDBCom is a win32 com if that makes any difference
MYDBCom myDBobject = new MYDBCom();
waitConnection = new ManualResetEvent(false);
myDBobject.connect(); //asynchron call.
//wait until server triggers the onConnection_event
waitConnection.WaitOne();
//server is now ready. Get the data from the server.
return myDBobject.getItem(itemName);
}
问题是事件未被触发 - 在WaitOne中等待时似乎被阻止了。如果我不使用waitOne使用
while(!connected)
{
Sleep(100);
DoEvents();
}
事件被触发。
WaitOne阻止的任何想法?有没有其他建议如何等到事件触发?
//弗雷德里克
答案 0 :(得分:2)
因为事件的消息泵与WaitOne调用位于同一个线程上。线程正在等待,因此,不会在你的消息周围抽水。
我应该补充一点,使用DoEvents()
通常不是一个明智的解决方案。通常有更好的方法来处理场景,例如从当前线程的消息泵之外的不同线程触发事件,这样就不需要运行当前线程来触发事件处理程序。