Elakkan ralat silang benang: Kemas kini elemen UI dengan selamat daripada urutan bukan UI
Apabila berinteraksi dengan elemen UI daripada utas bukan UI (seperti utas yang dihasilkan oleh acara penerimaan data port bersiri), isu keselamatan utas mesti ditangani untuk mengelakkan ralat silang benang.
Dalam kod C#, ralat "Operasi rentas benang tidak sah: mengakses kawalan 'textBox1' daripada utas selain daripada utas yang mencipta kawalan 'textBox1'" berlaku kerana utas UI memiliki kawalan textBox1 dan mengaksesnya daripada yang lain benang akan Menyebabkan konflik pertalian benang.
Untuk menyelesaikan masalah ini, penjadual mesti digunakan yang membenarkan urutan yang sesuai (biasanya utas UI) mengakses elemen UI. Dalam kes ini, perwakilan dan kaedah Invoke boleh digunakan untuk memastikan akses selamat benang:
<code class="language-csharp">delegate void SetTextCallback(string text); 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>
Sekarang, dalam pengendali acara bersiriPort1_DataReceived:
<code class="language-csharp">private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { txt += serialPort1.ReadExisting().ToString(); SetText(txt.ToString()); }</code>
Dengan menggunakan kaedah SetText, anda boleh mengagihkan tugas mengemas kini sifat teks textBox1 kepada utas UI, memastikan akses selamat dan bebas ralat kepada elemen UI daripada utas bukan UI.
Atas ialah kandungan terperinci Bagaimana untuk Mengemas kini Elemen UI dengan Selamat daripada Benang Bukan UI dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!