2016-09-23 10 views
0

データベースからデータをロードする詳細ビュー(リスト選択用)があり、データベースロジックをUIスレッドから離してブロックするのを避けることはできません。キャンセル/オーバーラップコール処理を伴うWPF MVVM非同期ワーカーメソッド

問題:。

  • ユーザー(例えば押したときに、それ
  • (簡単な部分、行われたときにUI部にviewmodelのプロパティ(複数可)を更新するロジックを派遣)非同期ハンドルくださいバックグラウンドスレッドがこの場合
    • 最後のエントリで行われる前に、前回のロード方法が解約する必要があり、新しいエントリをロード-key)の問題(例えばCanellationToken)
    • STた呼び出しの結果arted古い選択のために廃棄されず、コールがどのように行うには、後

を開始したロード操作の後に終了した場合には、最新のデータを上書きすることができ、特に以来、UIに到達しなければなりませんそれはWPFでですか?組み込みの方法がない場合、私の考えは、そのクラスを作成し、viewmodelでこれらの種類のロードメソッドに使用することです。例えば。結合

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; } 
    } 

答えて

0

あなたはNotifyTask<T>と呼ばれる私が書いたヘルパークラスを使用する場合、これは非常に単純ですが頭に浮かぶ二つの変種の擬似コードロードインジケータの表示/非表示を容易にするためのバインド可能なプロパティ)。

CancellationTokenSourceこれは、前の操作がある場合はキャンセルするための説明です。 Operationは、新しいデータが表示されるとすぐに上書きされます(古いデータは決して表示されないため、キャンセルされなくても無視されます)ので、古い操作からのUI更新を明示的にチェックして回避する必要はありません。

関連する問題