C# Benang latar belakang Pengecualian: "Operasi silang-thread tidak sah: kawalan '...' diakses dari benang selain benang yang dibuat."
Artikel ini menangani ralat C# biasa yang ditemui semasa bekerja dengan benang latar belakang dan unsur -unsur UI: "Benang panggilan tidak dapat mengakses objek ini kerana benang yang berbeza memilikinya." Ini berlaku kerana elemen UI biasanya dicipta dan dimiliki oleh benang UI utama. Cuba mengubah suai mereka dari benang latar belakang melanggar keselamatan benang.
Masalah:
Pengecualian timbul apabila benang latar belakang cuba mengakses atau mengubah suai elemen UI (seperti kotak teks atau kawalan lain) yang dibuat pada benang utama. WPF dan rangka kerja UI yang lain menguatkuasakan sekatan ini untuk mencegah keadaan kaum dan rasuah data.
Penyelesaian: Menggunakan Dispatcher.Invoke
. Dispatcher.Invoke
memastikan kemas kini UI berlaku pada benang yang betul, menyelesaikan pelanggaran akses silang.
Dispatcher.Invoke
katakan anda mempunyai kaedah
berjalan pada benang latar belakang yang perlu mengemas kini kotak teks bernama: GetGridData
txtSearchCountry
<code class="language-csharp">private void GetGridData(object sender, int pageIndex) { // ... other code ... objUDMCountryStandards.Country = txtSearchCountry.Text.Trim() != string.Empty ? txtSearchCountry.Text : null; // ... more code ... }</code>
: Dispatcher.Invoke
<code class="language-csharp">private void GetGridData(object sender, int pageIndex) { // ... other code ... this.Dispatcher.Invoke(() => { objUDMCountryStandards.Country = txtSearchCountry.Text.Trim() != string.Empty ? txtSearchCountry.Text : null; }); // ... more code ... }</code>
blok sehingga perwakilan melengkapkan pelaksanaan pada benang UI. Ini menjamin keselamatan benang. Dispatcher.Invoke
Dispatcher.Invoke
Dengan menggunakan
kini selamat dilakukan pada benang UI utama, mencegah pengecualian. Ingatlah untuk menggunakan corak ini untuk semua pengubahsuaian elemen UI yang dilakukan dari benang latar belakang. Dispatcher.Invoke
Atas ialah kandungan terperinci Mengapa benang latar belakang saya membuang 'benang panggilan tidak dapat mengakses objek ini'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!