在等待活动时阻止

时间:2009-05-28 17:34:20

标签: c# multithreading events

我有一个连接到服务器的外部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阻止的任何想法?有没有其他建议如何等到事件触发?

//弗雷德里克

1 个答案:

答案 0 :(得分:2)

因为事件的消息泵与WaitOne调用位于同一个线程上。线程正在等待,因此,不会在你的消息周围抽水。

更新

我应该补充一点,使用DoEvents()通常不是一个明智的解决方案。通常有更好的方法来处理场景,例如从当前线程的消息泵之外的不同线程触发事件,这样就不需要运行当前线程来触发事件处理程序。