Утечка памяти SerialPort в .NET 2.0 / 3.5 - PullRequest
0 голосов
/ 19 апреля 2009

У меня проблема с классом SerialPort.

Мы используем несколько последовательных портов в общем списке, поскольку нам необходимо подключиться к нескольким устройствам.

Вот как выглядит наш основной код:

List<SerialPort> ports = new List<SerialPort>();
private void button1_Click(object sender, EventArgs e)
{
    ports.Add(new SerialPort("COM6"));
    ports.Add(new SerialPort("COM7"));
    ports.Add(new SerialPort("COM8"));
    foreach (SerialPort port in ports)
    {
        port.Open();
    }
}

Теперь, после нажатия кнопки, если одно из устройств (в нашем случае это мобильный телефон) выключено или его кабель отсоединен от порта USB, происходит немедленная массовая утечка памяти.

Я заметил похожую тему здесь и несколько отчетов об ошибках в Microsoft Connect.

Ответы [ 2 ]

2 голосов
/ 19 апреля 2009

Вы уверены, что проблема в SerialPort, а не в драйвере устройства USB-Serial? Я бы попробовал еще один тест для проверки проблемы:

  1. Запуск hyperterm
  2. Подключитесь к проблемному устройству
  3. Проверка использования памяти
  4. Отключение таким же образом, что вызывает проблемы в C #
  5. Проверить использование памяти и сравнить

Если этого не происходит, то, в частности, есть ошибка SerialPort. Если это произойдет снова, вы, по крайней мере, будете знать, что это не имеет ничего общего с реализацией SerialPort. Проблема может быть в коде COM-порта Windows или в используемом вами драйвере. Лично я считаю более вероятным, что проблема может быть в драйвере, но я хотел бы знать, есть ли какая-то неизвестная проблема с последовательными портами Windows.

Я использовал SerialPort раньше при подключении / отключении портов без каких-либо проблем.

Еще одна вещь, которую вы можете попробовать отладить в коде CLR. Есть много других SO вопросов по этой теме , поэтому должно быть легко найти способ сделать это. Это должно позволить вам отладить немного дальше и точно определить, в какой момент в Open() происходит утечка памяти. Предупреждение: поскольку это «простая» оболочка для последовательного порта системы, вы можете быстро увидеть, что она переходит в мир P / Invoke и, вероятно, не увидит много.

1 голос
/ 19 апреля 2009

Не уверен, что проблема так проста, но правильно ли вы утилизируете свои SerialPort объекты? Вам нужно вызывать метод Dispose для каждого экземпляра, как только вы закончите с ними.

...