크로스 스레드 오류 방지 : 비 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