Apabila menggunakan Windows Windows di C#, dalam beberapa kes, "operasi silang yang tidak sah" mungkin ditemui. Kesalahan ini berlaku apabila anda cuba mengakses kawalan dari benang di luar penciptaan kawalan. Apabila cuba melakukan operasi data yang boleh menghalang benang UI, masalah ini biasanya berlaku, untuk menunjukkan bahawa pemaju menggunakan benang latar belakang untuk memuatkan data.
memahami masalah
Dalam senario yang disediakan, anda cuba memuatkan data pada benang berasingan, dan UI (termasuk kawalan pengguna) dibuat pada benang utama. Apabila kawalan kawalan akses akses Acara Kawalan Pengguna (mis., Periksa nilai kotak teks), ralat "operasi salib tidak sah" akan dicetuskan. Ini kerana kawalan dibuat pada benang utama, dan ia melawatnya dari benang lain untuk melanggar peraturan persatuan thread.
Gunakan Kawalan Akses Keselamatan InvokeRequired
Penyelesaian yang mungkin adalah menggunakan atribut kawalan kawalan. Atribut ini menunjukkan sama ada benang semasa adalah sama dengan benang yang dibuat oleh kawalan. Jika ia kembali benar, ini bermakna anda perlu memanggil kod pada benang yang betul. Contoh kod 1
Dalam contoh ini, baris pertama memeriksa sama ada InvokeRequired adalah benar. Jika ya, hubungi blok kod pada benang yang betul untuk memastikan akses yang betul ke UI. alternatif: nilai kawalan akses tidak langsung
<code class="language-csharp">UserContrl1_LoadDataMethod() { if (textbox1.InvokeRequired) // 第 1 行 { this.Invoke(new MethodInvoker(UserContrl1_LoadDataMethod)); return; } if (textbox1.Text == "MyName") // 现在不会引发异常 { // 加载与“MyName”对应的数据 // 填充稍后将绑定到网格的全局变量 List<string> } }</code>
Kaedah lain adalah secara tidak langsung mendapatkan nilai kawalan. Jangan mengakses kawalan terus dari benang latar belakang, tetapi dapatkan nilai mereka pada benang utama dan lulus ke peranti kerja latar belakang.
Dalam kes ini, nilai kotak teks diambil pada benang utama dan disimpan dalam pembolehubah tempatan. Kemudian, operasi pemuatan data pada benang latar boleh menggunakan pembolehubah ini dengan selamat.
Kesimpulan
<code class="language-csharp">UserContrl1_LOadDataMethod() { string name = ""; if (textbox1.InvokeRequired) { textbox1.Invoke(new MethodInvoker(delegate { name = textbox1.Text; })); } if (name == "MyName") { // 执行任何操作 } }</code>
Atas ialah kandungan terperinci Bagaimana cara mengakses borang tingkap dengan selamat dari benang latar belakang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!