Tengo unINotifyPropertyChanged con hilos
BindingList<T>
que está unido a un DataGridView. Una propiedad en mi clase requiere mucho tiempo para calcular, así que enhebré la acción. Después del cálculo elevo el evento OnPropertyChanged() para notificar a la grilla que el valor está listo.
Al menos, esa es la teoría. Pero como el método OnPropertyChanged se llama desde un hilo diferente, obtengo algunas excepciones weired en el método OnRowPrePaint de la grilla.
¿Alguien puede decirme cómo preveo que el evento OnPropertyChanged se ejecute en el hilo principal? No puedo usar Form.Invoke, ya que la clase MyClass no sabe que se ejecuta en una aplicación 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);
}
}
}
Funciona como un encanto. Hasta ahora no sabía acerca de BackgroundWorker. Eso hace que esta tarea sea tan fácil, mucho. –