2009-04-19 2 views
0

У меня очень большая проблема с классом SerialPort, и мне нужна помощь, чтобы решить эту проблему.Утечка памяти SerialPort в .NET 2.0/3.5

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

Это то, что наш основной код выглядит ...

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-порта, происходит немедленная массивная утечка памяти.

Пожалуйста, помогите нам с решением.

Я заметил подобную нить here и пару отчетов об ошибках в Microsoft Connect. Но сейчас мне нужно решение IMMEDIATE URGENT ... Было бы очень полезно, если кто-то поможет. Большое спасибо.

+0

Кстати, эта ссылка идет на expert-exchange (а не на Microsoft Connect) и, похоже, не работает. Как смешно в сторону, если между словами не было тире, оно могло читать как «экспертное изменение пола», которое отличается от «обмена экспертами», но все же является полностью действующим сайтом. Очень смешно. –

+0

Если вам требуется немедленное и срочное решение, тогда, как и в случае с StackOverflow, вам нужно позвонить в службу поддержки Microsoft и открыть билет. –

ответ

2

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

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

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

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

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

+0

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

1

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

+0

'Dispose()' существует только для того, чтобы разрешить * явный немедленный * выпуск ресурса. Каждый класс, который использует неуправляемые ресурсы, также реализует финализатор, в случае, если объект выходит за пределы области действия, не будучи явно размещен. Если вы хотите, это безопасная сеть. –

+0

Да, GC, конечно же, обойдется в распоряжение неуправляемыми ресурсами, используемыми классом в любом случае, но это может не произойти какое-то время, особенно если объекты находятся в глобальной области. Это может привести к утечке памяти. – Noldorin

Смежные вопросы