2009-04-19 2 views
0

SerialPort 클래스에 큰 문제가 있습니다.이 문제를 해결하려면 도움이 필요합니다..NET 2.0/3.5의 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 포트에서 분리되면 즉시 대량의 메모리 누출이 발생합니다.

해결책을 제공해주세요.

비슷한 스레드 here과 Microsoft Connect의 몇 가지 버그 보고서를 발견했습니다. 하지만 지금 당장은 즉각적인 긴급 해결책이 필요합니다 ... 누군가 도움이된다면 정말 고맙겠습니다. 정말 고마워요.

+0

btw, 전문가 연결 (Microsoft Connect가 아님)으로 연결되며 작동하지 않는 것 같습니다. 웃기는 일이지만, 단어 사이에 대시가 없다면 "전문가 교환"과는 다른 방식이지만 완전히 유효한 사이트 인 "전문 성 변경"으로 읽을 수 있습니다. 너무 웃기다. –

+0

즉각적이고 긴급한 해결 방법이 필요하다면 StackOverflow와 마찬가지로 Microsoft 지원에 전화하여 티켓을 열어야합니다. –

답변

2

문제가 SerialPort이고 USB-Serial 장치 용 드라이버가 아닌지 확인하십시오. 문제 장치

  • 확인 메모리 사용
  • C#에서 문제가 발생합니다 같은 방법으로 분리
  • 확인 메모리에 hyperterm
  • 연결까지

    1. 시작 : 나는이 문제를 검증하기 위해 다른 테스트를 시도 할 것 사용법 및 비교

    발생하지 않으면 특히 SerialPort에 버그가 있습니다. . 그것이 다시 발생하면 적어도 SerialPort의 구현과 아무런 관련이 없음을 알 수 있습니다. 문제는 윈도우의 COM 포트 코드 나 사용중인 드라이버에있을 수 있습니다. 개인적으로는 문제가 드라이버에있을 가능성이 높지만 Window의 직렬 포트에 대해 알려지지 않은 문제가 있는지 알고 싶습니다.

    이러한 문제없이 포트를 연결/분리하는 동안 전에 SerialPort을 사용했습니다.

    CLR 코드로 디버깅을 시도 할 수도 있습니다. 이 topic에는 많은 SO 질문이 있으므로이를 수행하는 방법을 쉽게 찾을 수 있어야합니다. 그게 당신이 좀 더 아래로 디버그하고 Open()의 어느 지점에서 메모리 누수가 발생하는지 정확히 알려야합니다. 그러나 시스템의 직렬 포트에 대한 "간단한"래퍼이므로 P/Invoke로 이동하는 것을 볼 수 있으며 많은 것을 볼 수 없을 것입니다.

  • +0

    아, 디자인에 대한 의견을 남기려면 on_click이 코드를 수행해서는 안되며, UI 코드에 속하지 않도록 해당 기능을 제외 시키십시오. –

    1

    이 문제는 간단하지 않지만 SerialPort 개체를 올바르게 처분하고 있습니까? 작업이 끝나면 즉시 각 인스턴스에 Dispose 메서드를 호출해야합니다.

    +0

    'Dispose()'는 자원의 명시 적 즉각적인 릴리스를 허용합니다. 관리되지 않는 리소스를 사용하는 모든 클래스는 개체가 명시 적으로 삭제되지 않고 범위를 벗어나는 경우 finalizer도 구현합니다. 당신이 원한다면 안전 그물. –

    +0

    예, 물론 GC는 어쨌든 클래스에서 사용하는 관리되지 않는 리소스를 처리하기 위해 주위를 돌아 다니지 만, 특히 개체가 전역 범위에있는 경우에는 잠시 동안이 작업이 수행되지 않을 수 있습니다. 이로 인해 쉽게 메모리 누출이 발생할 수 있습니다. – Noldorin