"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > C#의 비 UI 스레드에서 UI 요소를 안전하게 업데이트하는 방법은 무엇입니까?

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

2025-02-06에 게시되었습니다
검색:242

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

크로스 스레드 오류 방지 : 비 UI 스레드에서 UI 요소를 안전하게 업데이트

비 UI 스레드 (예 : 직렬 포트 데이터로부터 이벤트를 수신하여 생성 된 스레드)에서 UI 요소와 상호 작용할 때 스레드 안전 문제를 처리해야합니다.

C# 코드에서 "크로스 스레드 작업은 유효하지 않습니다 : Access Control 'TextBox1'은 제어 'TextBox1'"을 생성 한 스레드에서 UI 스레드가 TextBox1 컨트롤을 소유하고 액세스하기 때문에 발생합니다. 다른 스레드에서 나사회 연관 충돌이 발생합니다.

이 문제를 해결하려면 스케줄러를 사용하여 적절한 스레드 (일반적으로 UI 스레드)가 UI 요소에 액세스 할 수 있도록해야합니다. 이 경우 Delegate 및 Invoke 메소드를 사용하여 스레드 안전 액세스를 보장 할 수 있습니다.

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;
  }
}

이제 Serialport1_datareceived 이벤트 핸들러에서 :

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
  txt  = serialPort1.ReadExisting().ToString();
  SetText(txt.ToString());
}

setText 메소드를 사용하여 텍스트 박스 1 텍스트 속성을 UI 스레드에 업데이트하여 UI 스레드에서 UI 요소에 대한 안전하고 오류가없는 액세스를 보장하는 작업을 위임 할 수 있습니다.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3