> 백엔드 개발 > C++ > C#의 비 UI 스레드에서 UI 요소를 안전하게 업데이트하는 방법은 무엇입니까?

C#의 비 UI 스레드에서 UI 요소를 안전하게 업데이트하는 방법은 무엇입니까?

Susan Sarandon
풀어 주다: 2025-01-23 02:14:15
원래의
284명이 탐색했습니다.

How to Safely Update UI Elements from Non-UI Threads in C#?

크로스 스레드 오류 방지: 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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