2012-06-01 4 views
1

C#에서는 Windows 폼에 System.IO.Ports.SerialPort 구성 요소가 있습니다.SerialPort.Close()는 구성 요소에서 직렬 포트를 제거합니다. 구성 요소

foreach (SerialPort in components.Components) 
{ 
    // Do something. 
} 

하지만이 mySerialPort.Close() 실행할 때이 이후의 모든 루프를 놓친되도록 각하여 SerialPort는 components.Components 클래스에서 제거 : 나는 어떤에서 내가 루프과 같이 내 코드에 여러 곳이있다. 이거 버그 야? 아니면 의도적입니까? 왜 디자인 상으로는 그렇게 행동할까요?

내부 문서에 따르면 Close() 메서드는 Stream 개체 만 처리합니다.

답변

1

이것은 의도적으로 설계된 것입니다. 다른 모든 .NET 프레임 워크 클래스와 마찬가지로 SerialPort.Close() 메서드는 Dispose() 메서드를 호출합니다. 기본 클래스 인 Component에서 상속됩니다. Virtual Dispose (bool) 메서드를 호출하여 처분 패턴을 사용합니다. 어느 SerialPort가 스트림을 닫는가를 오버라이드 (override)합니다. Component가 컬렉션으로부터 컴퍼넌트를 삭제하기 위해서 사용하는 base.Dispose (bool) 메소드를 호출합니다.

이것은 자연스러운 동작입니다. SerialPort를 양식에 놓으면 양식이 닫힐 때 자동으로 삭제됩니다. 또한 창을 만들 때 포트를 열고 창을 닫을 때까지 포트를 열어 두는 것이 일반적입니다. 프로그램 실행 중간에 포트를 닫으면 문제가 발생합니다. 그러나 다른 방법으로는 지원됩니다. 개체를 직접 추적해야합니다.

관련 문제