> 백엔드 개발 > C++ > C#의 직렬 포트에서 TextBox를 안전하게 업데이트하는 방법은 무엇입니까?

C#의 직렬 포트에서 TextBox를 안전하게 업데이트하는 방법은 무엇입니까?

DDD
풀어 주다: 2025-01-23 02:13:07
원래의
285명이 탐색했습니다.

How to Safely Update a TextBox from a Serial Port in C#?

C#의 직렬 포트에서 TextBox를 업데이트할 때 크로스 스레드 예외 해결

C# 직렬 통신의 일반적인 문제는 serialPort1_DataReceived 이벤트 핸들러에서 TextBox를 업데이트하는 것과 관련됩니다. 직렬 포트는 별도의 스레드에서 작동하기 때문에 이 이벤트 핸들러에서 TextBox에 직접 액세스하면 "크로스 스레드 작업이 유효하지 않음" 예외가 발생합니다.

이 솔루션에는 TextBox의 텍스트를 업데이트하기 위한 스레드로부터 안전한 방법이 필요합니다. 이는 업데이트를 UI 스레드로 다시 마샬링하여 수행됩니다. 방법은 다음과 같습니다.

<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>
로그인 후 복사

SetText 메소드는 현재 스레드가 UI 스레드(textBox1.InvokeRequired)인지 확인합니다. 그렇지 않은 경우 Invoke을 사용하여 SetText 콜백을 UI 스레드로 마샬링하여 스레드 안전성을 보장합니다. 그렇지 않으면 TextBox를 직접 업데이트합니다.

이를 serialPort1_DataReceived 이벤트 핸들러에 통합하는 방법은 다음과 같습니다.

<code class="language-csharp">private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
    string receivedData = serialPort1.ReadExisting();
    SetText(receivedData); // Use the thread-safe SetText method
}</code>
로그인 후 복사

이 수정된 이벤트 핸들러는 직렬 포트에서 데이터를 읽고 SetText 메서드를 사용하여 TextBox를 안전하게 업데이트하여 크로스 스레드 예외를 방지합니다. 이 접근 방식은 UI 업데이트가 항상 올바른 스레드에서 수행되어 애플리케이션 안정성을 유지하도록 보장합니다.

위 내용은 C#의 직렬 포트에서 TextBox를 안전하게 업데이트하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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