2012-02-01 6 views
0

나는 직렬 포트에서 많은 양의 데이터를 읽고있는 WPF 프로그램을 가지고 있으며 현재 루프에서 데이터를 읽는 for 루프로 루핑하고 있습니다. 시간을 기록하고 파일에 기록합니다. 이 작업을 이벤트 처리 작업으로 설정하여 UI가 계속 업데이트 될 수 있도록하고 싶습니다.SerialPort.Close() 및 이벤트 처리기

이 목적을 위해 SerialPort.DataReceived 이벤트를 사용하는 것이 가장 좋을 것이라고 생각했지만, 작업 완료시이개체에서이 처리기를 제거 할 수 있어야합니다. 이 전화 번호는 Close() 일 때 처리됩니까? 아니면 다른 방법으로 처리기를 제거해야합니까?

+1

왜 핸들러를 제거해야합니까? Close는 핸들러를 제거하지 않지만 더 이상 호출되지 않습니다. –

+0

MSDN 라이브러리를 살펴 보았습니다 ... 그러나 이것에 대해서는 언급하지 않았습니다. – Luke

+0

이벤트 구동 방식으로 데이터를 처리하고 싶지 않을 때 포트를 사용할 때 다른 시간이 있기 때문에 처리기를 제거해야합니다. – Luke

답변

2

그럼 SerialPort 용 워퍼를 작성해 보겠습니다. 그리고 래퍼가 핸들러를 추적하고 닫을 때 핸들러를 제거하도록합니다. (따라서 모든 사용 인스턴스에서이 논리를 구현할 필요가 없습니다.) - = 메서드를 사용하십시오.

각 인스턴스에는 호출을 저장할 이벤트가 필요합니다. 예를 들어

(을 발사하지 말 것) :

private event EventHandler myHandle; 
    public event EventHandler myExposedHandle 
    { 
     add 
     { 
      myHandle += value; 
      serialPort.DataReceived += value; 
     } 
     remove 
     { 
      myHandle -= value; 
      serialPort.DataReceived -= value; 
     } 
    } 
    public void removeFunction() 
    { 
     myHandle = null; 
     serialPort.DataReceived -= myHandle; 
    } 
+0

이벤트 처리기를 + = 새 EventHandler (foo)로 설정하면; 그 때 처리기를 참조하려면 어떻게해야합니까? – Luke

+0

그 일을하는 예제를 추가하여 편집했습니다. 사용하지 않은 다른 이벤트에 저장할 수 있으며 사용중인 이벤트에서 사용하지 않은 이벤트를 빼낼 수 있습니다. – Corylulu

+1

워퍼에 대한보다 우아한 접근을 위해 다시 편집했습니다. – Corylulu

0

동일한 SerialPort 객체를 재사용하는 경우 이벤트를 null로 설정하여 처리기를 제거하십시오. 누적 된 핸들러가 없으면 정상적으로 작동합니다. 그렇지 않으면 좀 더 복잡해집니다.

+0

null로 설정하지 마십시오. - =를 Stu로 사용하고 500은 원래의 설명에서 언급했습니다. –

0

핸들러는 그대로두고 핸들러 로직에서 필요할 때 테스트합니다.