2012-05-04 15 views
13

Başka bir iş parçacığından bir UI öğesinin GÜNCELLEŞTİRİLMESİNDEN google/burada birçok iş parçacığı görüyorum.Başka bir ileti dizisinden UI öğelerine erişebilir misiniz? (ayarlamayın)

Sadece bir onay kutusunun değerini almak istiyorsam ne olur?

Özel bir şey yapmak zorunda kalmadan bunu yapabilir miyim?

+0

Bu – jorne

+4

@ CodeCaster yapmak için delegeleri kullanabilirsiniz Sadece denemek ve hangi işlerin genellikle iş parçacığı için güvenli kod almaz görüyorum. – hvd

+1

@hvd: Ancak, _here_'de yazılan tüm soruları tatmin ediyor. –

cevap

18

Edit: Daha önce yazdıklarımı geri almam gerekiyor.

Yükledi myTextBox adında bir metin kutusu ve Text özelliğin değerini almak çalıştı: Aşağıdaki çalıştı

Thread t = new Thread(
    o => 
    { 
     Thread.Sleep(2000);      
     string value = myTextBox.Text; 
     Thread.Sleep(2000); 
    }); 
t.Start(); 

Ve uygulaması (WPF) 2 saniye sonra çöküyor gibi görünüyor. dağıtıcınızın kullanma çalışır:

Thread t = new Thread(
    o => 
    { 
     Thread.Sleep(2000); 
     myTextBox.Dispatcher.BeginInvoke(
      (Action)(() => { string value = myTextBox.Text; })); 
     Thread.Sleep(2000); 
    }); 
t.Start(); 

Böylece, hala en azından WPF, GUI bileşenleri değerleri okurken memuru iplik geçmesi gerekir.

İkinci düzenleme: Bu daha iyi olur. Görünüşe göre klasik WinForms için deneyi tekrarlamak, özelliğini Invoke/BeginInvoke kullanmadan okumak için çalıştığını ortaya koymaktadır. İlginçtir, aynı zamanda gayet iyi çalışıyor (invoke olmadan), iyi çalışıyor, ancak ben emin değilim iplik güvenli ve uygulama bazı sebeplerden şikayetçi değildir.

Alt çizgi: okur/yazma tek konuya seri hale getirilmiş ve böylece hiçbir iş parçacığı güvenliği var sağlıyor gibi, diğer iş parçacıkları GUI bileşenleri ile etkileşim halindeyken memuru kullanmak için herhangi bir durumda iyi bir fikirdir sorunlar.

+0

+1. –

+0

"App şikayet etmiyor" -> Belki de yayın modunda çalışıyor? –

+0

@Henk Holterman: Sürüm ve Hata Ayıklamalarını denedim ve herhangi bir fark göremiyorum. – Tudor

0

yalnızca normalde yaptığınız gibi değeri okuyun. Sadece kontrolü güncellemek için, GUI iş parçacığına geçmeniz gerekir.

+1

Muhtemelen CheckBox.Checked ile çalışır, çünkü bu bir boolean özelliğidir. Diğerleri gönderdiği gibi, textbox.Text almak çok daha tehlikeli. –

2

İsterseniz kesinlikle iş parçacığı güvenli olmaz. Örneğin, Özellik kodu, birden çok işlemden oluşuyorsa, UI iş parçacığı, Alma işlemi sırasında yarı yarıya beklenmedik sonuçlara neden olabilir.

7

Başka bir ileti dizisinden UI öğelerine erişebilir misiniz? (ayarlanmadı)?

sayılı İşte

anlaşma. UI öğeleri çok sıkı iplik afinitesi gereksinimlerine sahiptir. Bu, öğeye yalnızca onu barındıran iş parçacığına erişebileceğiniz anlamına gelir. Bu, basit okumalar dahil her türlü erişimi içerir.

Basit özellikli alıcılar için işe yarayabilir, ancak algılanan güvenliğini, belirli bir denetimin gerçekleştirilme şeklinin tesadüfi bir sonucu olabilir. Control örneklerinin iş parçacığı afinitesine sahip olduklarından, potansiyel olarak farklı iş parçacığıyla uyumlu olmayan durumlarından bazılarını kaydetmek için iş parçacığı yerel depolama tekniklerini kullanabilirler. Ya da okuyamaya çalıştığınız değer yarım pişmiş bir durumda ise? Yazılıma, kontrolünüz üzerinde hiçbir kodun bulunmadığı bir kodun içinde meydana gelebileceğinden, bu okumaya erişimi senkronize etmenin bir yolu yoktur.Ve yine de bu, ortaya çıkabilecek ince bellek engelleyici sorunları görmezden geliyor. Yine, eğer işe yararsa, o zaman bir kaza olarak tebeşirlenin. UI öğelerine, onları barındıran bir konudan erişmek, felaket için bir reçete. İşler tahmin edilemez ve olağanüstü bir şekilde başarısız olabilir.


bu kuralın çok az istisnası vardır. ISynchronizeInvoke yöntemlerini kullanmak, böyle bir özel durumdur.

İlgili konular