> 백엔드 개발 > C++ > C# 멀티스레딩에서 '크로스 스레드 작업이 유효하지 않음' 오류를 해결하는 방법은 무엇입니까?

C# 멀티스레딩에서 '크로스 스레드 작업이 유효하지 않음' 오류를 해결하는 방법은 무엇입니까?

Linda Hamilton
풀어 주다: 2025-01-23 02:25:10
원래의
514명이 탐색했습니다.

How to Solve the

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿