Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mengemas kini Kawalan UI dengan Selamat daripada Benang Bukan UI dalam C#?
Pengesahan operasi rentas benang C#: mengakses kawalan daripada urutan bukan UI
Apabila mengakses elemen UI (seperti TextBox) dalam utas selain daripada utas yang mencipta kawalan, anda mungkin menghadapi pengecualian: "Operasi silang silang tidak sah: Mengakses kawalan 'textBox1' daripada utas selain daripada utas yang menciptanya". Ini kerana setiap elemen UI dikaitkan dengan urutan tertentu untuk mengendalikan acara dan pengubahsuaian.
Dalam contoh ini, anda cuba mengemas kini kawalan serialport1_DataReceived
daripada pengendali acara textBox1
, yang dilaksanakan pada urutan berasingan disebabkan oleh sifat tak segerak operasi port bersiri.
Penyelesaian:
Untuk menyelesaikan isu ini dan mengakses kawalan textBox1
dengan selamat daripada urutan bukan UI, anda perlu memastikan bahawa semua interaksi dengan elemen UI dipanggil pada urutan (UI) utama. Ini boleh dicapai menggunakan penjadual, yang menyediakan mekanisme komunikasi silang benang dan memastikan kemas kini UI dilakukan pada urutan yang betul.
Berikut ialah versi ubah suai kaedah textBox1
menggunakan kawalan kemas kini keselamatan yang diwakilkan serialport1_DataReceived
:
<code class="language-csharp">private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { // 在UI线程上更新'txt'变量 txt += serialPort1.ReadExisting().ToString(); // 使用委托在UI线程上访问'textBox1'控件 SetTextCallback d = new SetTextCallback(SetText); this.Invoke(d, new object[] { txt.ToString() }); } private delegate void SetTextCallback(string text); private void SetText(string text) { // 检查'textBox1'控件是否在不同的线程上创建 if (this.textBox1.InvokeRequired) { this.Invoke(d, new object[] { text }); } else { // 如果在UI线程上创建,则直接更新'textBox1'控件 this.textBox1.Text = text; } }</code>
Dengan pendekatan ini, anda memastikan bahawa kawalan textBox1
sentiasa diakses dan diubah suai pada utas (UI) utama, sekali gus menyelesaikan pengecualian operasi rentas benang.
Atas ialah kandungan terperinci Bagaimana untuk Mengemas kini Kawalan UI dengan Selamat daripada Benang Bukan UI dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!