Дескриптор недопустим с ManualResetEvent.Set()

У меня странная проблема с методом Set() в объекте ManualResetEvent. Я создал библиотеку, встраивающую DLL-объект COM, используемый для связи с машиной.

Перед отправкой сообщения в COM-объект (объект m_server) я подписываюсь на событие CommandReceived, затем отправляю сообщение (метод SendMessage) и жду ответа (WaitOne) от COM-объекта.

Как только событие возникает, я уведомляю ManualResetEvent с помощью метода Set(). Иногда я получаю исключение "Дескриптор недействителен".

По-видимому, ManualResetEvent использует внутренний дескриптор. По какой-то причине система была бы аннулирована.

Это код:

using (ManualResetEvent msgResponseWait = new ManualResetEvent(false)) {

__RCServer_CommandReceivedEventHandler onCommandReceivedDlg = delegate(ref short isock, string sCommand) {
    try {
        if (MessageReceived != null) {
            MessageReceived(this, null);
        }
        ServerMessage receivedServerMessage = ServerMessage.Parse(sCommand);
        if (msg.Command == receivedServerMessage.Command && msg.GvLocation == receivedServerMessage.GvLocation) {
            msg.Value = receivedServerMessage.Value;
            msg.ReceivedResponseDateTime = DateTime.Now;
            msgResponseWait.Set();
        } else {
            m_logger.AddTrace(
                string.Format("Mismatch between request/response." + Environment.NewLine +
                                "Command sent: '{0}' / Command received: '{1}'" + Environment.NewLine +
                                "Location sent: '{2}' / Location received: '{3}'",
                                msg.Command, receivedServerMessage.Command,
                                msg.GvLocation, receivedServerMessage.GvLocation),
                ELogGroup.Equipment, ESeverityLog.Error);
        }
    } catch (Exception e) {
        m_logger.AddErrHandler(e);
    }
};

m_server.CommandReceived += onCommandReceivedDlg;

msg.SendRequestDateTime = DateTime.Now;
m_server.SendMessage(ref iSocket, ref message);
if (!msgResponseWait.WaitOne(msg.TimeoutResponseInMillis)) {
    m_logger.AddTrace("No response received", ELogGroup.Equipment, ESeverityLog.Error);
    msg.TimeoutOccurred = true;
}

m_server.CommandReceived -= onCommandReceivedDlg;

msg.WaitResponse.Set();

}

Спасибо за вашу помощь

0 ответов

Другие вопросы по тегам