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!