C# 다중 스레드 애플리케이션에서 "크로스 스레드 작업이 유효하지 않음" 예외 처리
여러 스레드를 사용하는 C# 애플리케이션에서는 UI 요소 생성을 담당하는 스레드에서만 UI 요소에 액세스하도록 하는 것이 중요합니다. 이 원칙을 위반하면 "크로스 스레드 작업이 유효하지 않습니다." 예외가 발생합니다.
C# 스레딩 및 UI 요소 소유권 이해
C#에서는 여러 스레드를 통한 동시 실행이 가능합니다. 각 스레드는 자체 컨텍스트 내에서 독립적으로 작동합니다. 결정적으로 UI 요소(예: 텍스트 상자)는 특정 스레드(일반적으로 기본 UI 스레드)에 속합니다.
문제: 승인되지 않은 스레드에서 UI 요소에 액세스
소유 스레드가 아닌 스레드가 UI 요소의 속성을 수정하려고 시도하면 오류가 발생합니다. 이는 백그라운드 스레드에서 이벤트를 처리할 때(예: 직렬 포트 데이터 수신) 자주 발생하는 일반적인 시나리오입니다.
해결책: Dispatcher 호출 구현
해결 방법은 디스패처를 사용하여 작업을 올바른 스레드로 마샬링하는 것입니다. 이는 UI 컨트롤의 스레드로부터 안전한 수정을 보장합니다.
코드 구현
이 솔루션을 구현하는 방법은 다음과 같습니다.
먼저 대리인을 정의합니다.
<code class="language-csharp">private delegate void SetTextCallback(string text);</code>
다음으로 텍스트 상자를 안전하게 업데이트하는 방법을 만듭니다.
<code class="language-csharp">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
메서드를 호출합니다.
<code class="language-csharp">private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { txt += serialPort1.ReadExisting(); SetText(txt); }</code>
이 접근 방식을 사용하면 textBox1.Text
속성이 안전하게 업데이트되어 "크로스 스레드 작업이 유효하지 않음" 예외를 방지할 수 있습니다. InvokeRequired
검사를 통해 디스패처 호출이 필요한지 여부를 효율적으로 판단할 수 있습니다.
위 내용은 C# 멀티스레딩에서 '크로스 스레드 작업이 유효하지 않음' 오류를 해결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!