C#의 직렬 포트에서 TextBox를 업데이트할 때 크로스 스레드 예외 해결
C# 직렬 통신의 일반적인 문제는 serialPort1_DataReceived
이벤트 핸들러에서 TextBox를 업데이트하는 것과 관련됩니다. 직렬 포트는 별도의 스레드에서 작동하기 때문에 이 이벤트 핸들러에서 TextBox에 직접 액세스하면 "크로스 스레드 작업이 유효하지 않음" 예외가 발생합니다.
이 솔루션에는 TextBox의 텍스트를 업데이트하기 위한 스레드로부터 안전한 방법이 필요합니다. 이는 업데이트를 UI 스레드로 다시 마샬링하여 수행됩니다. 방법은 다음과 같습니다.
<code class="language-csharp">delegate void SetTextCallback(string text); private void SetText(string text) { if (this.textBox1.InvokeRequired) { SetTextCallback d = new SetTextCallback(SetText); this.Invoke(d, new object[] { text }); } else { this.textBox1.Text = text; } }</code>
이 SetText
메소드는 현재 스레드가 UI 스레드(textBox1.InvokeRequired
)인지 확인합니다. 그렇지 않은 경우 Invoke
을 사용하여 SetText
콜백을 UI 스레드로 마샬링하여 스레드 안전성을 보장합니다. 그렇지 않으면 TextBox를 직접 업데이트합니다.
이를 serialPort1_DataReceived
이벤트 핸들러에 통합하는 방법은 다음과 같습니다.
<code class="language-csharp">private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { string receivedData = serialPort1.ReadExisting(); SetText(receivedData); // Use the thread-safe SetText method }</code>
이 수정된 이벤트 핸들러는 직렬 포트에서 데이터를 읽고 SetText
메서드를 사용하여 TextBox를 안전하게 업데이트하여 크로스 스레드 예외를 방지합니다. 이 접근 방식은 UI 업데이트가 항상 올바른 스레드에서 수행되어 애플리케이션 안정성을 유지하도록 보장합니다.
위 내용은 C#의 직렬 포트에서 TextBox를 안전하게 업데이트하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!