私のビューにバインドされたプロパティを持つクラスがあります。私のビューを最新の状態に保つために、私はINotifyPropertyChangedを実装し、プロパティの変更ごとにイベントを発生させます。非同期を実装する方法INotifyPropertyChanged
今、アプリケーションをフリーズする重い機能があります。私はそれらをバックグラウンドタスクに入れたいと思う。
:まず、ここで(ボタンをクリックしたときに、例えば)私の現在のアプローチ
private async void HeavyFunc()
{
foreach (var stuff)
{
count += await Task.Run(() => stuff.Fetch());
}
if (count == 0)
//...
}
スタッフクラス
public async Task<int> Fetch()
{
//network stuff
RaisePropertyChanged("MyProperty");
}
public async void RaisePropertyChanged(string pChangedProperty)
{
await Application.Current.Dispatcher.BeginInvoke(
System.Windows.Threading.DispatcherPriority.Normal,
new ThreadStart(() =>
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(pChangedProperty);
}
);
}
上記のコードは、( "DependencySourceは" で作成されなければならない例外を与えます"DependencyObject"のような同じスレッド)。
AFAIK、新しいスレッドを作成して実行する必要があります(待っている間)。 'await Task.Run(...); 'はこのジョブを実行する必要があります。
PropertyChangedイベントはUIに直接影響するため、UIスレッドで呼び出すとよい判断になります。これがDispatcher.BeginInvokeを呼び出す理由です。
私が理解できないこと:上記の例外は、異なるスレッドがデータの原因である場合に発生します。しかし、私は明示的に私のUIスレッドとイベントオブジェクトをUIスレッドで作成する必要があります。だから私はなぜ例外を取得するのですか?
私の主な質問は、上記のような非同期プログラミングの問題のほとんどを回避または処理するために、一般にINotifyPropertyChangedインターフェイスのイベントを実装する方法です。どのような機能を構築する際に考慮する必要がありますか?
スレッドでpropertychangedイベントを発生させているため、ui要素が作成されていない場合はアクセスできません。 – CodingYoshi
実際にどのコードがuiスレッドと別のスレッドで実行されているかを理解するには[this](http://stackoverflow.com/questions/41271185/interface-freeze-when-trying-to-update-datagridview/41272238#41272238) – CodingYoshi
プロパティ自体はビットマップのようなDepedencyObjectですか? –