나는 datagridview에 바인딩 된INotifyPropertyChanged with threads
BindingList<T>
을 가지고 있습니다. 내 클래스의 한 속성은 계산 시간이 오래 걸리므로 작업을 스레드했습니다. 계산이 끝나면 값이 준비되었음을 알리는 OnPropertyChanged() 이벤트를 발생시킵니다.
적어도 그것이 이론입니다. 그러나 OnPropertyChanged 메서드는 differend 스레드에서 호출되기 때문에 눈금의 OnRowPrePaint 메서드에서 예외가 발생합니다.
누구나 내가 OnPropertyChanged 이벤트를 메인 스레드에서 실행되도록 미리 알려줄 수 있습니까? MyClass 클래스는 Winforms 응용 프로그램에서 실행된다는 것을 알지 못하기 때문에 Form.Invoke를 사용할 수 없습니다.
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에 대해 몰랐다. 이렇게하면이 작업이 매우 쉽습니다. –