Rumah >pembangunan bahagian belakang >C++ >Kenapa aplikasi WPF multithreaded saya membuang 'Thread panggilan tidak dapat mengakses objek ini kerana benang yang berbeza memilikinya'?
Menangani pengecualian "operasi silang-thread" dalam WPF multithreading
Aplikasi WPF multithreaded memerlukan pengurusan yang teliti terhadap pertalian benang. Setiap elemen UI WPF terikat pada benang tertentu (biasanya benang UI utama). Mencuba untuk mengakses atau mengubah suai elemen UI dari hasil benang yang berbeza dalam "thread panggilan tidak dapat mengakses objek ini kerana benang yang berbeza memiliki" pengecualian.
Menyelesaikan masalah kod anda
Isu anda berpunca daripada cuba mengemas kini elemen UI dalam kaedah, yang mungkin berjalan pada benang latar belakang (mis., Melalui GetGridData
atau BackgroundWorker
). Penyelesaiannya terletak pada marshaling kemas kini UI kembali ke benang utama. Task
Penyelesaian Dispatcher
Objek menyediakan mekanisme untuk melaksanakan kod dengan selamat pada benang UI. Inilah cara untuk refactor kaedah Dispatcher
anda: GetGridData
<code class="language-csharp">private void GetGridData(object sender, int pageIndex) { Standards.UDMCountryStandards objUDMCountryStandards = new Standards.UDMCountryStandards(); objUDMCountryStandards.Operation = "SELECT"; objUDMCountryStandards.Country = string.IsNullOrEmpty(txtSearchCountry.Text.Trim()) ? null : txtSearchCountry.Text; // Use Dispatcher.Invoke to update UI elements on the main thread this.Dispatcher.Invoke(() => { DataSet dsCountryStandards = objStandardsBusinessLayer.GetCountryStandards(objUDMCountryStandards); // ... Your UI update code here ... e.g., // dataGrid.ItemsSource = dsCountryStandards.Tables[0].DefaultView; }); }</code>Dengan membungkus kod pengubahsuaian UI anda dalam
, anda menjamin bahawa operasi ini berlaku pada benang yang memiliki unsur-unsur UI, menghalang pengecualian silang-thread. Ini memastikan keselamatan benang dan mengekalkan integriti aplikasi WPF anda. this.Dispatcher.Invoke(() => { ... })
Atas ialah kandungan terperinci Kenapa aplikasi WPF multithreaded saya membuang 'Thread panggilan tidak dapat mengakses objek ini kerana benang yang berbeza memilikinya'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!