Я написал консольное приложение.net 4.0, которое периодически связывается с GSM-модемом, чтобы получить список полученных SMS-сообщений (это USB-модем, но код подключается к нему через драйвер последовательного порта и отправляет AT-команды -, между прочим, это модем Sierra Wireless, но я не могу его изменить, и у меня есть последний драйвер ). Что происходит, так это то, что через какой-то период времени (, может быть, часы, может быть дни ), он просто перестает работать. Вот фрагмент лога...
2012-04-17 23:07:31 DEBUG Modem Check (108) - Executing AT command 'AT+CPMS="ME"'...
2012-04-17 23:07:31 DEBUG Modem Check (108) - Finished executing 'AT+CPMS="ME"'
2012-04-17 23:07:31 DEBUG Modem Check (108) - Detaching event handlers for 'COM13'
2012-04-17 23:07:31 DEBUG Modem Check (108) - Disposing the SerialPort for 'COM13'
Это конец лога -больше ничего, хотя я ожидал увидеть хотя бы еще одно утверждение, вот соответствующий код:
internal T Execute()
{
var modemPort = new SerialPort();
T ret;
try
{
modemPort.ErrorReceived += ModemPortErrorReceived;
modemPort.PortName = _descriptor.PortName;
modemPort.Handshake = Handshake.None;
modemPort.DataBits = 8;
modemPort.StopBits = StopBits.One;
modemPort.Parity = Parity.None;
modemPort.ReadTimeout = ReadTimeout;
modemPort.WriteTimeout = WriteTimeout;
modemPort.NewLine = "\r\n";
modemPort.BaudRate = _descriptor.Baud;
if (!modemPort.IsOpen)
{
modemPort.Open();
}
ret = _command.Execute(modemPort, _logger);
_logger.Debug("Detaching event handlers for '{0}'",
_descriptor.PortName);
modemPort.ErrorReceived -= ModemPortErrorReceived;
_logger.Debug("Disposing the SerialPort for '{0}'",
_descriptor.PortName);
}
catch (IOException ex)
{
_logger.Error(ex.Message);
throw new CommandException(
string.Format(CultureInfo.CurrentCulture,
ModemWrapperStrings.COMMAND_ERROR,
ex.Message),
ex);
}
catch (UnauthorizedAccessException ex)
{
_logger.Error(ex.Message);
throw new CommandException(
string.Format(CultureInfo.CurrentCulture,
ModemWrapperStrings.COMMAND_ERROR,
ex.Message),
ex);
}
finally
{
modemPort.Dispose();
_logger.Debug("Modem on port '{0}' disposed",
_descriptor.PortName);
}
return ret;
}
Как вы видите, он зависает в методе Dispose класса SerialPort.
Я немного погуглил и пришел к этой проблеме:Закрытие последовательного порта Зависание приложения из этой темы:Зависание последовательного порта при закрытии . Кажется, что консенсус заключается в том, чтобы закрыть порт в другом потоке, но это только для приложения форм? В моем случае у меня есть простое консольное приложение, поэтому я не думаю, что оно применимо (, оно просто работает в цикле в основном потоке ). Я даже не уверен, что это на самом деле проблема (, я чувствую, что более вероятно, что есть проблема с драйвером последовательного порта от модема, но я не знаю, и, возможно, я несправедлив к модему ). Насколько я понимаю, у меня есть три варианта:
Мне не очень нравится ни один из эти обходные пути, но я думаю оставить порт открытым и просто посмотреть, что произойдет (У меня такое чувство, что это приведет к утечке памяти или еще хуже,выявите какую-то другую проблему с модемом, но, возможно, я просто пессимистичен, и если это так, я, вероятно, мог бы закрыть его каждые 24 часа, скажем, и повторно -открыть его снова ), поэтому мой вопрос..,
Есть ли альтернативная проблема с этим кодом, которая может быть причиной такого поведения, или есть альтернативный обходной путь для того, что я описал выше?