Ho unaINotifyPropertyChanged con fili
BindingList<T>
che è destinato a un datagridview. Una proprietà della mia classe richiede molto tempo per calcolare, quindi ho eseguito l'azione. Dopo il calcolo, sollevo l'evento OnPropertyChanged() per notificare alla griglia che il valore è pronto.
Almeno, questa è la teoria. Ma poiché il metodo OnPropertyChanged viene chiamato da un thread diverso, ottengo alcune eccezioni weired nel metodo OnRowPrePaint della griglia.
Qualcuno può dirmi come anticipare l'evento OnPropertyChanged da trarre nel thread principale? Non riesco a utilizzare Form.Invoke, poiché la classe MyClass non è a conoscenza dell'esecuzione in un'applicazione Winforms.
public class MyClass : INotifyPropertyChanged
{
public int FastMember {get;set;}
private int? slowMember;
public SlowMember
{
get
{
if (slowMember.HasValue)
return slowMember.Value;
else
{
Thread t = new Thread(getSlowMember);
t.Start();
return -1;
}
}
}
private void getSlowMember()
{
Thread.Sleep(1000);
slowMember = 5;
OnPropertyChanged("SlowMember");
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
PropertyChangingEventHandler eh = PropertyChanging;
if (eh != null)
{
eh(this, e);
}
}
}
Funziona come un fascino. Fino ad ora non sapevo di BackgroundWorker. Questo rende questa attività così facile, grazie mille. –