0
データベースからデータをロードする詳細ビュー(リスト選択用)があり、データベースロジックをUIスレッドから離してブロックするのを避けることはできません。キャンセル/オーバーラップコール処理を伴うWPF MVVM非同期ワーカーメソッド
問題:。
- ユーザー(例えば押したときに、それ
- (簡単な部分、行われたときにUI部にviewmodelのプロパティ(複数可)を更新するロジックを派遣)非同期ハンドルくださいバックグラウンドスレッドがこの場合
- 最後のエントリで行われる前に、前回のロード方法が解約する必要があり、新しいエントリをロード-key)の問題(例えばCanellationToken)
- STた呼び出しの結果arted古い選択のために廃棄されず、コールがどのように行うには、後
public class ViewModel<TInput, TResult>
{
private CancellationTokenSource _cts;
public NotifyTask<TResult> Operation { get; private set; }
public void Load(TInput input)
{
if (_cts != null)
_cts.Cancel();
_cts = new CancellationTokenSource();
Operation = NotifyTask.Create(loadFunc(input, _cts.Token));
}
}
データがOperation.Result
に行うことができます(および他のデータがあります。
public class ViewModelBackgroundLoader<TInput, TResult>
{
public ViewModelBackgroundLoader(Func<TInput, CancellationToken, TResult> loadFunc, Action<TResult> uiContinuation)
{
}
public void Load(TInput input)
{
// set cancellation for previous loadFunc
// async await loadAction on threadpool thread
// If not cancelled...
// uiContinuation() on UI thread
}
}
public class ViewModelBackgroundLoadedProperty<TInput, TResult> : INotifyPropertyChanged
{
public ViewModelBackgroundLoadedProperty(Func<TInput, CancellationToken, TResult> loadFunc)
{
}
public TInput Input
{
set
{
// set cancellation for running loadFunc
// async await loadAction on threadpool thread
// If not cancelled...
// Update Result property and fire propertychanged (in UI thread)
}
}
public TResult Result { get; }
}