Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mengemas kini Kawalan UI dengan Selamat daripada Benang Berasingan dalam C# untuk Mengelakkan Pengecualian Benang Silang?

Bagaimana untuk Mengemas kini Kawalan UI dengan Selamat daripada Benang Berasingan dalam C# untuk Mengelakkan Pengecualian Benang Silang?

Linda Hamilton
Linda Hamiltonasal
2025-01-23 02:26:10723semak imbas

How to Safely Update UI Controls from a Separate Thread in C# to Avoid Cross-Thread Exceptions?

Mengelakkan Pengecualian Cross-Thread dalam C#: Mengemas kini Kawalan UI Dengan Selamat

Masalahnya: Aplikasi C# sering menghadapi pengecualian "Operasi lintasan tidak sah" apabila mengemas kini kawalan UI daripada urutan selain daripada urutan UI utama. Ini biasanya berlaku apabila memproses data daripada sumber luaran, seperti port UART mikropengawal, dalam urutan yang berasingan.

Senario: Bayangkan mikropengawal menghantar data suhu melalui UART. Aplikasi C# anda menerima data ini dalam urutan latar belakang, tetapi cuba mengemas kini terus TextBox dengan nilai suhu membuang pengecualian.

Punca Punca: Kawalan UI terikat pada urutan ia dicipta. Mengaksesnya daripada urutan lain melanggar peraturan ini.

Penyelesaian: Memanfaatkan Penghantar

Kunci untuk menyelesaikan masalah ini ialah menggunakan penghantar, mekanisme yang memastikan kemas kini UI berlaku pada urutan yang betul. Ini melibatkan corak yang mudah, tetapi berkesan:

  1. Buat Perwakilan: Tentukan perwakilan untuk merangkum operasi kemas kini UI:

    <code class="language-csharp">delegate void SetTextCallback(string text);</code>
  2. Laksanakan Kaedah Kemas Kini: Kaedah ini menyemak sama ada utas semasa ialah utas UI. Jika tidak, ia menggunakan Invoke untuk menyusun kemas kini pada urutan UI:

    <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>
  3. Kemas kini daripada Benang Latar Belakang: Dalam pengendali acara serialPort1_DataReceived anda (atau yang setara), panggil kaedah SetText selepas menerima data:

    <code class="language-csharp">private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
        string receivedData = serialPort1.ReadExisting();
        SetText(receivedData); 
    }</code>

Pendekatan ini memastikan bahawa semua kemas kini UI dilakukan dengan selamat pada urutan UI utama, menghalang pengecualian lintasan. Semakan InvokeRequired dengan cekap mengendalikan situasi di mana kemas kini sudah berada pada urutan yang betul, mengelakkan overhed yang tidak perlu.

Atas ialah kandungan terperinci Bagaimana untuk Mengemas kini Kawalan UI dengan Selamat daripada Benang Berasingan dalam C# untuk Mengelakkan Pengecualian Benang Silang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn