2013-07-10 1 views
0

직렬 포트 (C#/.Net)를 정의한 다음 데이터를 수신 할 때마다 SerialDataReceivedEventHandler을 할당했습니다. 데이터가 수신 될 때마다직렬 포트 데이터가 수신되었을 때 여러 동작을 처리하는 방법

myPort.DataReceived += new SerialDataReceivedEventHandler (myEventHandler); 

그러나 나는 등의 여러 가지 작업을 수행해야합니다 내 SQL 데이터베이스에

  • 저장 데이터를.
  • 업데이트 UI
  • 에를 RichTextBox는

내가 이 MyEventAPIHandler 내에서 모든 기능을 실행해야 응답 직렬 메시지를 다시 보내; 그게 올바른 연습인가요? 문제는 예를 들어, RichTextBoxmyEventHandler에서 변경하려고 할 때 크로스 스레드 작업을 수행 중임을 알리는 오류가 발생합니다.

UPDATE :

private void myEventHandler (object sender, SerialDataReceivedEventArgs e) 
{ 
    Action myAction =() => rtbMyRichTextBox.Text = InputMessageString; 
    if (rtbMyRichTextBox.InvokeRequired) 
     rtbMyRichTextBox.Invoke(myAction); 
    else 
     myAction(); 

    StoreToSqlDatabase(); 

    SerialWriteResponseMessage(); 
} 

답변

1

해당 이벤트 핸들러 내에서의 모든 작업을 수행하거나 호출하는 방법으로한다.

UI 스레드와 동기화하여 스레드 간 문제를 해결할 수 있습니다. Windows Forms 응용 프로그램 인 경우 InvokeRequiredInvoke을 사용하려고합니다. 이러한 문서 링크는 좋은 예입니다. SerialPort.DataReceived에 대한

문서는 말한다 : 데이터를하여 SerialPort 개체에서 수신 될 때

DataReceived 이벤트가 보조 스레드에서 발생합니다. 이 이벤트는 주 스레드가 아닌 보조 스레드에서 발생하기 때문에 UI 요소와 같이 주 스레드의 일부 요소를 수정하려고하면 스레딩 예외가 발생할 수 있습니다. 기본 폼 또는 컨트롤의 요소를 수정해야하는 경우 적절한 스레드에서 작업을 수행 할 Invoke를 사용하여 변경 요청을 다시 게시하십시오.

코드는 같이 보일 것입니다 :

void myEventHandler(object sender, SerialDataReceivedEventArgs e) 
{ 
    DoSqlUpdate(); 
    this.Invoke(UpdateUI, data); // pass whatever data that needs to be updated 
    SendResponseMessage(); 
} 
+0

어떻게 위 내 업데이트 같은 어떻습니까? – boardbite

+0

@boardbite : 정상 작동합니다. 당신은'this.InvokeRequired'와'this.Invoke'를 사용할 수 있습니다. –

+0

잘 설명되어 있습니다. ** UI 업데이트 ** 스레드에서만 크로스 스레드 문제가 우려됩니까? 또는 ** SQL 데이터베이스 통신 **과 별도 스레드에서 실행중인 스레드 간 문제뿐만 아니라 ** 직렬 쓰기 **를 다른 스레드에서 실행합니까? – boardbite