私は、datagridviewにバインドされているスレッドによるINotifyPropertyChanged
BindingList<T>
を持っています。私のクラスの1つのプロパティは計算に時間がかかるので、私はそのアクションをスレッド化しました。計算が終わると、OnPropertyChanged()イベントを発生させて、値が準備されていることをグリッドに通知します。
少なくとも、それは理論です。しかし、OnPropertyChangedメソッドはdifferendスレッドから呼び出されているので、グリッドのOnRowPrePaintメソッドでいくつかの例外が発生します。
誰かが私はどのようにOnPropertyChangedイベントをメインスレッドでexcecutedにするか教えていただけますか? 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について知らなかった。 これは、この作業をとても簡単にします。 –