Saya punya skenario. (Formulir Windows, C #, .NET)
- Ada bentuk utama yang menampung beberapa kontrol pengguna.
- Kontrol pengguna melakukan beberapa operasi data berat, sehingga jika saya langsung memanggil
UserControl_Load
metode, UI menjadi tidak responsif selama durasi untuk eksekusi metode beban. - Untuk mengatasi ini saya memuat data pada utas yang berbeda (mencoba mengubah kode yang ada sesedikit mungkin)
- Saya menggunakan utas pekerja latar belakang yang akan memuat data dan ketika selesai akan memberi tahu aplikasi bahwa ia telah melakukan tugasnya.
- Sekarang muncul masalah nyata. Semua UI (bentuk utama dan kontrol pengguna anak) dibuat pada utas utama utama. Dalam metode LOAD dari usercontrol saya mengambil data berdasarkan nilai-nilai beberapa kontrol (seperti kotak teks) pada userControl.
Kodesemu akan terlihat seperti ini:
KODE 1
UserContrl1_LoadDataMethod()
{
if (textbox1.text == "MyName") // This gives exception
{
//Load data corresponding to "MyName".
//Populate a globale variable List<string> which will be binded to grid at some later stage.
}
}
Pengecualian yang diberikannya adalah
Operasi lintas-thread tidak valid: Kontrol diakses dari utas selain utas yang dibuatnya.
Untuk mengetahui lebih banyak tentang ini, saya melakukan beberapa googling dan sebuah saran muncul seperti menggunakan kode berikut
KODE 2
UserContrl1_LoadDataMethod()
{
if (InvokeRequired) // Line #1
{
this.Invoke(new MethodInvoker(UserContrl1_LoadDataMethod));
return;
}
if (textbox1.text == "MyName") // Now it wont give an exception
{
//Load data correspondin to "MyName"
//Populate a globale variable List<string> which will be binded to grid at some later stage
}
}
TAPI TAPI TAPI ... sepertinya saya kembali ke titik awal. Aplikasi kembali menjadi tidak responsif. Tampaknya karena eksekusi baris # 1 jika kondisi. Tugas pemuatan sekali lagi dilakukan oleh utas induk dan bukan yang ketiga yang saya hasilkan.
Saya tidak tahu apakah saya menganggap ini benar atau salah. Saya baru mengenal threading.
Bagaimana cara mengatasi ini dan juga apa efek dari eksekusi Baris # 1 jika diblokir?
Situasinya adalah ini : Saya ingin memuat data ke variabel global berdasarkan nilai kontrol. Saya tidak ingin mengubah nilai kontrol dari utas anak. Saya tidak akan pernah melakukannya dari utas anak.
Jadi hanya mengakses nilai sehingga data yang sesuai dapat diambil dari basis data.