Mengelakkan Ralat "Operasi silang benang tidak sah" dalam Kemas Kini UI .NET
Dalam .NET, percubaan untuk mengubah suai elemen UI daripada urutan yang berbeza daripada yang menciptanya mengakibatkan ralat "Operasi lintasan tidak sah" yang ditakuti. Ini berpunca daripada peraturan penting: Operasi UI mesti dilaksanakan pada urutan yang pada asalnya mencipta elemen UI.
Mari kita ilustrasikan dengan contoh kod:
<code class="language-csharp">System.Threading.Thread t = new System.Threading.Thread(() => { // Perform intensive operations... listView1.Items.Add(lots of items); // Error prone line! // More UI updates... }); t.Start();</code>
Kod ini menghasilkan urutan untuk mengendalikan tugas. Walau bagaimanapun, apabila urutan cuba mengemas kini UI (menambah item pada listView1
), ralat berlaku kerana kemas kini tidak berlaku pada urutan UI utama.
Pendekatan Selamat untuk Benang UI
Manipulasi UI langsung daripada urutan bukan UI adalah dilarang. Berikut ialah dua penyelesaian yang berkesan:
Kaedah Invoke
: Jika anda mempunyai rujukan kepada kawalan UI (seperti listView1
), gunakan kaedah Invoke
. Kaedah ini membentuk baris gilir tindakan untuk pelaksanaan pada urutan UI.
Kelas BackgroundWorker
: BackgroundWorker
memudahkan operasi tak segerak. Ia mencipta urutan latar belakang dan memudahkan komunikasi antara utas latar belakang dan utas UI, menjadikan kemas kini merentas benang terurus.
<code class="language-csharp">BackgroundWorker bw = new BackgroundWorker(); bw.DoWork += (s, e) => { /* Create items here */ }; bw.RunWorkerCompleted += (s, e) => { /* Update listView1 here */ }; bw.RunWorkerAsync();</code>
Kedua-dua Invoke
dan BackgroundWorker
menyediakan mekanisme selamat untuk mengendalikan operasi rentas benang, memastikan kemas kini UI berlaku semata-mata pada urutan yang sesuai, menghalang ralat "Operasi lintasan benang tidak sah".
Atas ialah kandungan terperinci Bagaimana untuk Mengendalikan Operasi Cross-Thread dengan Selamat dalam .NET untuk Kemas Kini UI?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!