У меня естьINotifyPropertyChanged с резьбой
BindingList<T>
, который привязан к DataGridView. Одно свойство в моем классе занимает много времени, чтобы вычислить, поэтому я выполнил действие. После вычисления я поднимаю событие OnPropertyChanged(), чтобы уведомить сетку, что значение уже готово.
По крайней мере, это теория. Но так как метод OnPropertyChanged вызывается из другого потока, я получаю некоторые перечеркнутые исключения в методе OnRowPrePaint сетки.
Может ли кто-нибудь сказать мне, как я должен исключить событие OnPropertyChanged в основной теме? Я не могу использовать Form.Invoke, так как класс MyClass не знает, что он работает в приложении 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);
}
}
}
Работает как очарование. До сих пор я не знал о BackgroundWorker. Это делает эту задачу настолько легкой, что много. –