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:
Buat Perwakilan: Tentukan perwakilan untuk merangkum operasi kemas kini UI:
<code class="language-csharp">delegate void SetTextCallback(string text);</code>
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>
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!