SORU
26 EYLÜL 2008, Cuma


Ç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)

  1. Bazı kullanıcı denetimi barındıran ana bir form var.
  2. 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.
  3. Ü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)
  4. Veri yükleme olacak ve yapılan çalışmaları yaptığı bu uygulama bildirecektir arka plan bir iş parçacığı kullanılır.
  5. Ş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
26 EYLÜL 2008, Cuma


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;
        }
    }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ben Vivona

    Ben Vivona

    24 Ocak 2010
  • martin shervington

    martin sherv

    7 EKİM 2011
  • TheDroidDemos

    TheDroidDemo

    15 ŞUBAT 2011