Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menyelesaikan Ralat 'Operasi Cross-Tread Tidak Sah' dalam C# Multithreading?

Bagaimana untuk Menyelesaikan Ralat 'Operasi Cross-Tread Tidak Sah' dalam C# Multithreading?

Linda Hamilton
Linda Hamiltonasal
2025-01-23 02:25:10516semak imbas

How to Solve the

Mengendalikan Pengecualian "Operasi Cross-Tread Tidak Sah" dalam Aplikasi Berbilang Thread C#

Dalam aplikasi C# yang menggunakan berbilang urutan, adalah penting untuk memastikan elemen UI diakses secara eksklusif oleh urutan yang bertanggungjawab untuk penciptaannya. Melanggar prinsip ini membawa kepada pengecualian "Operasi silang benang tidak sah" yang ditakuti.

Memahami C# Threading dan Pemilikan Elemen UI

C# membenarkan pelaksanaan serentak melalui berbilang rangkaian. Setiap urutan beroperasi secara bebas dalam konteksnya sendiri. Yang penting, elemen UI (seperti kotak teks) tergolong dalam urutan tertentu, biasanya urutan UI utama.

Masalahnya: Mengakses Elemen UI daripada Benang Tidak Dibenarkan

Ralat timbul apabila utas selain daripada utas pemilik cuba mengubah suai sifat elemen UI. Ini ialah senario biasa, yang sering dihadapi semasa mengendalikan acara daripada urutan latar belakang (seperti penerimaan data port bersiri).

Penyelesaian: Melaksanakan Invocation Dispatcher

Penyelesaian melibatkan penggunaan penghantar untuk mengawal operasi pada benang yang betul. Ini menjamin pengubahsuaian selamat untuk rangkaian kawalan UI.

Pelaksanaan Kod

Berikut ialah cara untuk melaksanakan penyelesaian ini:

Pertama, tentukan perwakilan:

<code class="language-csharp">private delegate void SetTextCallback(string text);</code>

Seterusnya, buat kaedah untuk mengemas kini kotak teks dengan selamat:

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

Akhir sekali, dalam data port bersiri anda menerima pengendali acara, hubungi kaedah SetText:

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

Pendekatan ini memastikan bahawa harta textBox1.Text dikemas kini dengan selamat, menghalang pengecualian "Operasi lintasan tidak sah". Semakan InvokeRequired dengan cekap menentukan sama ada panggilan penghantar diperlukan.

Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Ralat 'Operasi Cross-Tread Tidak Sah' dalam C# Multithreading?. 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