Дескриптор недопустим с 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();
}
Спасибо за вашу помощь