2013-02-19 21 views
5

私はレイヤ間で非同期で通信するためのベストプラクティスを探しています。 私が自動生成されたコードでこれを見たので、現在、私はモデルでのBackgroundWorkerを使うmvvm light toolkitMVVMで何が非同期ですか? ModelまたはViewModelです。ベストプラクティス?

を使用しています。バックグラウンドワーカーではなく非同期コール。

public void GetConfig(Action<Config, Exception> callback) 
{ 
    BackgroundWorker backgroundWorker = new BackgroundWorker(); 
    backgroundWorker.DoWork += (backgroundWorkerSender, backgroundWorkerArgs) => 
    { 
     try 
     { 
      backgroundWorkerArgs.Result = AppEnvironment.Instance.Config; 
     } 
     catch (Exception exception) 
     { 
      backgroundWorkerArgs.Result = null; 
     } 
    }; 

    backgroundWorker.RunWorkerCompleted += (backgroundWorkerSender, backgroundWorkerArgs) => 
    { 
     if (backgroundWorkerArgs.Result != null) 
     { 
      callback((Config) backgroundWorkerArgs.Result, null); 
     } 
     else 
     { 
      /* ToDo: exceptionhandling */ 
     } 
    }; 

    backgroundWorker.RunWorkerAsync(); 
} 

は今、私はViewModelに非同期一部を実装 AsyncDelegateCommandを見つけました。

private ICommand _refreshObjectDefinitionCommand; 
public ICommand RefreshObjectDefinitionCommand 
{ 
    get 
    { 
     return _refreshObjectDefinitionCommand 
      ?? (_refreshObjectDefinitionCommand = new AsyncDelegateCommand(delegate 
       { 
        IsBusy = true; 
        _dataService.GetObjectDefinition(
        (xmlObjectDef, errorConfig) => 
        { 
         if (errorConfig != null) 
         { 
          /* ToDo Lenz: exceptionhandling */ 
          return; 
         } 

         ObjectDefinition = xmlObjectDef; 
        }); 

        _dataService.GetObjectDefinitionTreeView(
         (treenodes, errorConfig) => 
         { 
          if (errorConfig != null) 
          { 
           /* ToDo Lenz: exceptionhandling */ 
           return; 
          } 

          TreeNodes = treenodes; 
         }); 
       }, 
           () => _isConnected, o => IsBusy = false, exception => IsBusy = false)); 
    } 
} 

私はベストプラクティスについて少し混乱していますか?私は多くの記事を読んだ。しかし、どういうわけか彼らはいつも異なった意見です。維持するための通常の努力の下で最良の互換性を提供する規定はありますか?

考え

モデルのためのいくつかの食べ物:

http://csharperimage.jeremylikness.com/2009/12/simplifying-asynchronous-calls-in.html

http://www.dzone.com/articles/mvvmlight-and-async

のViewModel

http://www.codeproject.com/Articles/123183/Asynchronus-MVVM-Stop-the-Dreaded-Dead-GUI-Problem

​​

+0

タスクパターンを読みやすくすることはできませんか? async/await .. – JustAnotherUserYouMayKnow

+0

もちろんですが、私が知っている限り、それは.net 4.5以降利用可能ですか?!? –

+0

4.0とsilverlight 5をサポートするNuGetパッケージがあります。これをあなたのプロジェクトにインストールすれば、それは魅力的です! http://nuget.org/packages/Microsoft.CompilerServices.AsyncTargetingPack/ – JustAnotherUserYouMayKnow

答えて

1

まあ、私はモデルのfecthingを言うと、ビューモデルに変換しは非同期であるだろう。誰がそれを行うかは、アーキテクチャに依存します。ビューモデル自体で行うことも、非同期ロードアップや初期化されたVMのマッピングを行うコントローラレイヤーを使用して表示することもできます。また、バックグラウンドワーカーは、並列操作のためにタスククラスを使用すべき過去です。もちろん、VMからの変更についてのビューを通知するときにディスパッチャを呼び出すことを忘れないでください。

コードサンプル:

Task<string>.Factory.StartNew(() => 
{ 
    string text = GetArticleText(); 
    Application.Current.Dispatcher.BeginInvoke(new Action(()=>MyTextProperty = text)); 
}); 
1

私はあなたのViewModelに非同期コードを置くことを提案し、データを保存するために、あなたのモデルを残すでしょう。私がMVVMを使い始めたとき、最初に学んだことの1つは、モデルからロジックを削除し、代わりにそれをViewModelsに保持することでした。あなたのコードを置く場所は、コードを読んでいるすべての人がそれを理解できる限り重要ではありません。

関連する問題