Bir senaryom var. (Windows Forms, C #, .NET)
- Bazı kullanıcı kontrollerini barındıran bir ana form vardır.
- Kullanıcı denetimi bazı ağır veri işlemi yapar, böylece
UserControl_Load
yöntemi doğrudan çağırırsam kullanıcı arabirimi, yükleme yöntemi yürütme süresi boyunca yanıt vermez hale gelir. - Bunun üstesinden gelmek için farklı bir iş parçacığına veri yüklüyorum (mevcut kodu olabildiğince az değiştirmeye çalışıyorum)
- Verileri yükleyecek bir arka plan iş parçacığı kullandım ve bittiğinde uygulama işini yaptığını bildirir.
- Şimdi gerçek bir sorun geldi. Tüm kullanıcı arayüzü (ana form ve alt kullanıcı kontrolleri) birincil ana iş parçacığında oluşturuldu. Usercontrol LOAD yönteminde userControl bazı denetim (metin kutusu gibi) değerlerine dayalı veri getiriyorum.
Sahte kod şöyle görünecektir:
KOD 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.
}
}
Verdiği İstisna
Çapraz iş parçacığı işlemi geçerli değil: Denetim, oluşturulduğu iş parçacığı dışındaki bir iş parçacığından erişildi.
Bu konuda daha fazla bilgi edinmek için biraz googling yaptım ve aşağıdaki kodu kullanarak bir öneri geldi
KOD 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
}
}
ANCAK ANCAK ANCAK ... Görünüşe göre bir kareye geri döndüm. Uygulama tekrar yanıt vermiyor. Durum 1 ise satır 1'in yürütülmesinden kaynaklanıyor gibi görünüyor. Yükleme görevi tekrar doğurduğum üçüncü değil, ana iş parçacığı tarafından yapılır.
Bunu doğru mu yanlış mı algıladığımı bilmiyorum. İplik takmada yeniyim.
Bunu nasıl çözebilirim ve ayrıca eğer blok # 1'in blok halinde yürütülmesinin etkisi nedir?
Durum şudur : Bir denetimin değerine göre küresel bir değişkene veri yüklemek istiyorum. Alt iş parçacığından bir denetimin değerini değiştirmek istemiyorum. Bunu hiç bir çocuk evresinden yapmayacağım.
Bu nedenle, değere yalnızca ilgili verilerin veritabanından getirilebilmesi için erişilir.