Çapraz iş parçacığı işlemi geçerli değil: Kontrol iplik oluşturulduğu iş parçacığı dışında başka analizler
Bir senaryo var. (Windows Forms, C#, .NET)
- Bazı kullanıcı denetimi barındıran ana bir form var.
- Kullanıcı denetimi biraz ağır veri işlem, eğer doğrudan UI yükü yöntemi yürütme süresi için tepki vermiyor olmak
UserControl_Load
yöntem çağrısı gibi geliyor. - Üstesinden gelmek için bu ben farklı bir iş parçacığı üzerinde veri yükleme (varolan kodu olabildiğince az değiştirmek için çalışıyor)
- Veri yükleme olacak ve yapılan çalışmaları yaptığı bu uygulama bildirecektir arka plan bir iş parçacığı kullanılır.
- Şimdi gerçek bir sorun geldi. Tüm UI (ana form ve alt usercontrols) birincil ana konu üzerinde oluşturuldu. Usercontrol YÜKÜ yöntemi userControl üzerinde bazı kontrol değerlerine dayalı veri (textbox gibi) alınıyor ediyorum.
Yarı kod şu şekilde 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.
}
}
Ä°stisna oldu verdi
Çapraz iş parçacığı işlemi geçerli değil: Kontrol iplik oluşturulduğu iş parçacığı dışında başka erişilebilir.
Bu konuda daha fazla bilgi için bazı araştırmalarımı yaptım ve bir öneri aşağıdaki kodu kullanarak gibi 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
}
}
AMA AMA AMA... başladığımız noktaya geri döndüm gibi görünüyor. Uygulamayı yeniden boş bakan olur. Koşul satırı yürütülmesi nedeniyle #1 gibi görünüyor. Yükleme görevi yeniden üst iplik ve ben olurken o üçüncü değil tarafından yapılır.
Bu doğru ya da yanlış algıladım bilmiyorum. İş parçacığı yeniyim.
Bunu nasıl çözerim ve de#1 blok Satır yürütme etkisi nedir?
Durum bu: Genel değişken bir kontrol değerine göre veri yüklemek istiyorum. Alt parçacığı bir denetimin değerini değiştirmek istemiyorum. Hiç bir alt parçacığı yapacak değilim.
Yani sadece ilgili veri böylece değeri erişim veritabanından alınamadı.
CEVAP
SilverHorse's update comment başına çözüm olarak şöyle olmalıdır:
UserContrl1_LOadDataMethod()
{
string name = "";
if(textbox1.InvokeRequired)
{
textbox1.Invoke(new MethodInvoker(delegate { name = textbox1.text; }));
}
if(name == "MyName")
{
// do whatever
}
}
Ayrı konu ciddi bir işlemöncegeri denetim iş parçacığı geçmek için çalışır. Örneğin:
UserContrl1_LOadDataMethod()
{
if(textbox1.text=="MyName") //<<======Now it wont give exception**
{
//Load data correspondin to "MyName"
//Populate a globale variable List<string> which will be
//bound to grid at some later stage
if(InvokeRequired)
{
// after we've done all the processing,
this.Invoke(new MethodInvoker(delegate {
// load the control with the appropriate data
}));
return;
}
}
}
Çapraz iş parçacığı işlemi geçerli değ...
Nasıl geçerli iş parçacığı ana iş parç...
Görev.Fabrika.() StartNew çağıran iş p...
Veya geçerli iş parçacığı olup olmadığ...
C başka bir iş parçacığı GUI güncelleş...