Класс SerialPort иногда зависает при Dispose

Я написал консольное приложение.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.

Я немного погуглил и пришел к этой проблеме:Закрытие последовательного порта Зависание приложения из этой темы:Зависание последовательного порта при закрытии . Кажется, что консенсус заключается в том, чтобы закрыть порт в другом потоке, но это только для приложения форм? В моем случае у меня есть простое консольное приложение, поэтому я не думаю, что оно применимо (, оно просто работает в цикле в основном потоке ). Я даже не уверен, что это на самом деле проблема (, я чувствую, что более вероятно, что есть проблема с драйвером последовательного порта от модема, но я не знаю, и, возможно, я несправедлив к модему ). Насколько я понимаю, у меня есть три варианта:

  1. Закрыть порт в другом потоке
  2. Вставить задержку перед закрытием порта
  3. Оставить порт открытым навсегда

Мне не очень нравится ни один из эти обходные пути, но я думаю оставить порт открытым и просто посмотреть, что произойдет (У меня такое чувство, что это приведет к утечке памяти или еще хуже,выявите какую-то другую проблему с модемом, но, возможно, я просто пессимистичен, и если это так, я, вероятно, мог бы закрыть его каждые 24 часа, скажем, и повторно -открыть его снова ), поэтому мой вопрос..,

Есть ли альтернативная проблема с этим кодом, которая может быть причиной такого поведения, или есть альтернативный обходной путь для того, что я описал выше?

12
задан kmp 18 April 2012 в 12:10
поделиться