Блокировать во время ожидания события - PullRequest
1 голос
/ 28 мая 2009

У меня есть внешний 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 Ответ

2 голосов
/ 28 мая 2009

Поскольку насос сообщений о событиях находится в том же потоке, что и ваш вызов WaitOne. Нить ждет и, следовательно, не качает ваши сообщения.

Обновление

Я должен добавить, что использование DoEvents() обычно не рекомендуется. Часто есть более эффективные способы обработки сценария, например, запуск события из другого потока вне потока сообщений вашего текущего потока, чтобы ваш текущий поток не нуждался в запуске для запуска обработчика события.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...