Soru & Cevap

Dispatcher.BeginInvoke metodu arayüzü update etmiyor

12.03.2014 - 06:18

Diyelim ki elimde bir liste var. Her bir liste öğesi bir kişiyi temsil ediyor ve kişinin ismini ve numarasını görüntülüyor. Bunun için bir class ya da User control oluşturduğumu varsayalım. "rehber" olarak tanımladığımız dictionary olsun. Bu dictionary nin key leri kişinin ismi, value leri ise o kişinin numarasıdır. Ayrıca kişileri eklediğimiz "kisilistesi" adında bir liste grafik arayüzü olsun. Elimde grafik arayüzü dondurmaya yetecek çoğunlukta kişi olduğu zaman doğal olarak arayüzü dondurmamak ve kullanıcının canını sıkmamak için bir "lstekle" adında bir backgroundworker kullanmam çok mantıklı olacaktır. Bu backgroundworker ın DoWork eventi lstekle_DoWork olarak tanımlayıp aşağıdaki kodu oluşturduğumda kişi itemlerinin bir bir eklenmesini bekliyorum. Ancak windows phone emulatoru tüm kişileri aldıktan sonra grafik arayüze ekliyor. Eğer elimde 10000 tane kişi varsa bu durmda 10 sn boyunca listeye hiçbirşey eklenmiyor sonra aynı anda hepsi birden ekleniyor. Bu durumu nasıl çözebilirim?

private void lstekle_DoWork(object sender, DoWorkEventArgs e)

        {
           // Dispatcher.BeginInvoke(() => workeris());
            foreach (KeyValuePair<string, string> item in rehber)
            {
                Dispatcher.BeginInvoke(() =>
                {
                    Person kisi = new Person();
                    kisi.isim.Text = item.Key;
                    kisi.numara.Text = item.Value;
                    kisilistesi.Items.Add(kisi);
                });

            }
        }

12 Görüntülenme

2 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

Profile picture for user omer.birler
omer.birler
13.03.2014 - 10:53
Kisilistesi bir listbox. Listbox a eklerken bunu Foreach döngüsünde tek tek yapıyorum. İtemsource özelliğini kullanmıyorum. Sorun burada Dispactcher.BeginInvoke fonksiyonu. Eğer backgroundworker kullanmayıp aynı iştemi main thread üzerinden yaparsam herhangi bir sorun olmuyor sadece ekleme işlemi grafik arayüzü donduruyor bu istemediğim birşey. Task karın kullanışını bilmiyorum ancak main thread dışında başka bir thread ya da backgroundworker kullandığında grafik arayüzle ilgili bir işlem yaptığında dispatcher.BeginInvoke kullanılmalı yoksa Invalid Cross thread hatası veriyor
picture-472-1375079047.jpg
mehmet.altiparmak
13.03.2014 - 08:32

Merhaba Ömer, 

Öncelikle WP uygulamasında BackgroundWorker kullanmak yerine Task kullanmanı tavsiye ederim. Hatta onu kullanmalısın. Daha önce de söylediğim gibi async-await anahtar kelimelerinin çalışma mantığını ve Task ile nasıl kullanılabildiğini incele. 

Yukarıdaki probleminde kullandığın kisilistesi değişkeninin tipi nedir? ListBox'ın ItemsSource'unu nerede set ediyorsun?