【问题标题】:Block while waiting for event等待事件时阻塞
【发布时间】:2009-05-28 17:34:19
【问题描述】:

我有一个外部 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 阻塞?还有其他建议如何等待事件触发吗?

//弗雷德里克

【问题讨论】:

    标签: c# multithreading events


    【解决方案1】:

    因为事件的消息泵与您的 WaitOne 调用位于同一线程上。该线程正在等待,因此不会在您的消息周围循环。

    更新

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

    【讨论】:

    • 谢谢。现在似乎很明显,但由于 myDBobject.connect() 在另一个线程或进程上,我不确定。但我不确定如何在另一个线程中执行此操作:如果我在另一个线程中运行 connect(),我必须在那里等待 connect() 在我向第一个线程发出信号之前完成,然后这是完全相同的问题.. .
    • 观察一下,您在代码中的哪个位置注册了该活动?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    相关资源
    最近更新 更多