크로스 스레드 오류 방지: UI가 아닌 스레드에서 UI 요소를 안전하게 업데이트
UI가 아닌 스레드(예: 직렬 포트 데이터 수신 이벤트에 의해 생성된 스레드)의 UI 요소와 상호작용할 때 크로스 스레드 오류를 방지하기 위해 스레드 안전 문제를 처리해야 합니다.
C# 코드에서는 UI 스레드가 textBox1 컨트롤을 소유하고 다른 스레드에서 액세스하기 때문에 "잘못된 크로스 스레드 작업: 'textBox1' 컨트롤을 생성한 스레드가 아닌 다른 스레드에서 'textBox1' 컨트롤에 액세스 중입니다."라는 오류가 발생합니다. 스레드는 스레드 선호도 충돌을 일으킵니다.
이 문제를 해결하려면 적절한 스레드(일반적으로 UI 스레드)가 UI 요소에 액세스할 수 있도록 허용하는 스케줄러를 사용해야 합니다. 이 경우 스레드로부터 안전한 액세스를 보장하기 위해 대리자와 Invoke 메서드를 사용할 수 있습니다.
<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>
이제 serialPort1_DataReceived 이벤트 핸들러에서:
<code class="language-csharp">private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { txt += serialPort1.ReadExisting().ToString(); SetText(txt.ToString()); }</code>
SetText 메서드를 사용하면 textBox1의 텍스트 속성을 업데이트하는 작업을 UI 스레드에 위임하여 UI가 아닌 스레드에서 UI 요소에 안전하고 오류 없이 액세스할 수 있습니다.
위 내용은 C#의 비 UI 스레드에서 UI 요소를 안전하게 업데이트하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!