2012-03-01 13 views
5

Arka plan çalışmasında ağır iş yapıyorum, böylece Silverlight UI iş parçacığı etkilemiyor. Ancak, DoWork işlevinde bu özel durumu alıyorum:UI iş parçacığına erişmeden bir BackgroundWorker'da "UnauthorizedAccessException" alma

UnauthorizedAccessException "Geçersiz çapraz iş parçacığı erişimi". Ben BackgroundWorker gelen UI iş parçacığı erişemez biliyorum

, Ancak bu istisna bu satırda oluşur:

ListBoxItem insert = new ListBoxItem(); 

Nasıl benim ui iş parçacığı erişiyor ??

Aşağıda daraltdığım gerçek kod parçası. o GUI parçası olarak kabul edilir, böylece

void FillSourceList() 
{ 
    busyIndicator.IsBusy = true; 
    BackgroundWorker bw = new BackgroundWorker(); 
    bw.DoWork += (sender, args) => 
     { 
      List<ListBoxItem> x = new List<ListBoxItem>(); 
      for (int i = 0; i < 25; i++) 
      { 
       ListBoxItem insert = new ListBoxItem(); //<---Getting exception here 
       insert.Content = "whatever"; 
       x.Add(insert); 
      } 
      args.Result = x; 
     }; 
    bw.RunWorkerCompleted += (sender, args) => 
     { 
      foreach (ListBoxItem insert in (List<ListBoxItem>)(args.Result)) 
       sourceList.Items.Add(insert); 
      busyIndicator.IsBusy = false; 
     }; 

    bw.RunWorkerAsync(); 
} 

cevap

4

A ListBoxitem Kontrol kaynaklanmaktadır: Temelde i sourceList liste kutusu eklemek istediğiniz iş yaratma listboxitems yapıyorum. Ben de bir iplik içinde Tamam olmak için bir 'müstakil' madde beklerdim ama görünüşe göre değil.

bariz çözüm: İçerik (dizeleri) bir listesini x oluşturmak ve Tamamlanan olaya Öğeler oluşturulmasını geciktirir.

+0

Teşekkür ederiz. Evet, bunun tamamıyla değil, yine de ilginç olması biraz gereksiz gibi görünüyor. Ancak .. Böyle renklendirme olarak içeriğine dayalı 'ListBoxItem's, bazı diğer işlem yapmak, bu yüzden sadece dizeleri oluşturamaz, ben kadar ben bir KeyValuePair içine gereken bilgileri ya da bir şey ambalaj yöneteceksiniz herhalde onların oluşturma. –

+0

Öğeler için mini bir ViewModel düşünebilirsiniz. Sadece ItemsSource'a bir listeyi bağlayın ve ayarlanmışsınız, iplik güvenliği dahildir. –

+0

İyi fikir! Muhtemelen, bunu yapacağım projenin geri kalanı için çok fazla değişiklik gerektirmemelidir (umarım). Ben uzun bir liste ItemsSource üzerinden bir denetime bağlı olarak, liste değiştirerek hala "Geçersiz çapraz iplik erişim" neden olacağını düşünürdüm –

İlgili konular