8

INotifyPropertyChanged uygulayan özel bir nesnem var. Koleksiyonun BindingList tabanlı olduğu bu nesnelerden oluşan bir koleksiyonum var. Koleksiyon için bir bağlama kaynağı oluşturdum ve bindingsource ve datagridview'in veri kaynaklarını ayarladım.Arka plan iş parçacığından bir databoundview veri kümesini doğru güncelleştirin

Her şey harika çalışıyor, ancak arka plan iş parçacıklarındaki özel nesnede özellikleri güncellemem gerekiyor. Bunu yaptığımda şu hatayı alıyorum:

BindingSource kendi veri kaynağı olamaz. BindingSource

geri refere değerlere DataSource ve DataMember özelliklerini koymayın benim tam sorunu (ve çözüm?) Var gibi gözüküyor şu yazı bulundu ama oldukça onu anlamaya olamaz. http://social.msdn.microsoft.com/forums/en-US/winformsdatacontrols/thread/3566f7c7-eb47-422e-ab09-9549a18da360/

benim yarattığım ve benim iş nesnesi gönderim başına oper değişkenleri başlatıldı ve ardından benim toplama sınıfa iki olay fonksiyonları koydu. Bu doğru derlenmiş, ancak çalışırken istisnasız askıda kalıyor.

Invoke/Begin Invoke kullanmasını söyleyen pek çok ileti gördüm, ancak kullanıcı arabirimindeki herhangi bir işlevi çağırmıyorum, yalnızca iş nesnelerini güncelliyorum, bu yüzden çağrıları nereye koyacağımı bilmiyorum.

Tek bir kısıtlama: İş nesnesinin kimin görüntülendiğinden habersiz kalmasını istiyorum (birden çok tüketici olduğu için), böylece GUI referanslarını iş nesnesine göndererek, daha sonra bu başvuruları kullanarak çağırmayı çağırabiliyorum. bir seçenek.

cevap

14

Bu sınıfı çalışan bir forumda buldum. Benim ihtiyaçları için biçimlendirmek için örnek zaman aldı beri sadece ben de okunabilir bir referans olarak buradan ilan edebilirler yerine BindingList

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

using System.ComponentModel; 
using System.Threading; 

namespace Utility 
{ 
    public class ThreadedBindingList<T> : BindingList<T> 
    { 
     SynchronizationContext ctx = SynchronizationContext.Current; 

     protected override void OnAddingNew(AddingNewEventArgs e) 
     { 

      if (ctx == null) 
      { 
       BaseAddingNew(e); 
      } 
      else 
      { 
       ctx.Send(delegate 
       { 
        BaseAddingNew(e); 
       }, null); 
      } 
     } 
     void BaseAddingNew(AddingNewEventArgs e) 
     { 
      base.OnAddingNew(e); 
     } 
     protected override void OnListChanged(ListChangedEventArgs e) 
     { 
      // SynchronizationContext ctx = SynchronizationContext.Current; 
      if (ctx == null) 
      { 
       BaseListChanged(e); 
      } 
      else 
      { 
       ctx.Send(delegate 
       { 
        BaseListChanged(e); 
       }, null); 
      } 
     } 
     void BaseListChanged(ListChangedEventArgs e) 
     { 
      base.OnListChanged(e); 
     } 
    } 
} 
+0

@Marc Gravell [Yazının eski olduğunu biliyorum ama .. Başka bir listeden ThreadedBindingList (benim Ilist'im) örneklendiğinde - bunun için bir yöntem yoktur. Bu yöntemin “eksiksiz” olması veya bir iş parçacığı sorunu olması için yöntemin olmaması gerekir mi? – Stix

1

bu kullanın. Biçimlendirme dışında hiçbir şey değişmedi.

using System.ComponentModel; 
using System.Threading; 

namespace Utility 
{ 
    public class ThreadedBindingList : BindingList 
    { 
    SynchronizationContext ctx = SynchronizationContext.Current; 
    protected override void OnAddingNew(AddingNewEventArgs e) 
    { 
     if (ctx == null) 
     { 
     BaseAddingNew(e); 
     } 
     else 
     { 
     ctx.Send(delegate { BaseAddingNew(e); }, null); 
     } 
    } 

    void BaseAddingNew(AddingNewEventArgs e) 
    { 
     base.OnAddingNew(e); 
    } 

    protected override void OnListChanged(ListChangedEventArgs e) 
    { 
     // SynchronizationContext ctx = SynchronizationContext.Current; 
     if (ctx == null) 
     { 
     BaseListChanged(e); 
     } 
     else 
     { 
     ctx.Send(delegate { BaseListChanged(e); }, null); 
     } 
    } 

    void BaseListChanged(ListChangedEventArgs e) 
    { 
     base.OnListChanged(e); 
    } 
    } 
} 
0

Pek parçacığı güvenli, ancak arka plan iş parçacığı daha hızlı gösterilebilecekleri daha nesne özellikleri değiştirerek ise yukarıdaki cevaplara bu küçük değişiklik büyük bir etki yaratabilir;

protected override void OnListChanged(ListChangedEventArgs e) 
{ 
    // SynchronizationContext ctx = SynchronizationContext.Current; 
    if (ctx == null) 
    { 
    BaseListChanged(e); 
    } 
    else if(e.ListChangedType == ListChangedType.ItemChanged) 
    { 
    ctx.Post(delegate { BaseListChanged(e); }, null); 
    } 
    else 
    { 
    ctx.Send(delegate { BaseListChanged(e); }, null); 
    } 
} 

aynı nesne birden çok kez değiştirilmiş olup olmadığını yayınlanan çağrı sayısını azaltarak ve tüm yayınlanmıştır çağrılar işlendikten kadar engeller çağrı göndermek emin herhangi sonradan yapmak için herhangi bir öneri hoş geldiniz.