2013-02-19 50 views
5

我正在尋找在圖層之間進行異步通信的最佳實踐。 我使用mvvm light toolkit什麼是MVVM中的異步? Model或ViewModel。最佳實踐?

目前我使用一個BackgroundWorker在模型,因爲我看到這個在自動生成的代碼。不是背景工作者,而是異步電話。

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

現在我發現它實現在視圖模型的異步部分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

視圖模型

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

​​

+0

不會讓任務模式更容易閱讀嗎?當然,與異步/等待.. – JustAnotherUserYouMayKnow 2013-02-19 09:25:10

+0

,但據我所知只是因爲.net 4.5可用?!? – 2013-02-19 09:52:32

+0

有一個NuGet包可以支持4.0和silverlight 5.將它安裝到您的項目中,它就像一個魅力! http://nuget.org/packages/Microsoft.CompilerServices.AsyncTargetingPack/ – JustAnotherUserYouMayKnow 2013-02-19 12:21:12

回答

1

嗯,我想說模型的fecthing,並把它變成視圖模型是異步。誰來做,取決於體系結構,它可以在視圖模型本身上完成,也可以使用控制器層進行異步加載和映射初始化虛擬機以查看。另外背景工作者是過去應該使用Task類進行並行操作。當然,不要忘記在通知虛擬機發生更改時通過調度程序調用。

代碼示例:

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

我建議把異步代碼在您的視圖模型,並留下你的模型來存儲數據。當我開始使用MVVM時,我學到的第一件事就是從我的模型中移除邏輯,並將其保留在ViewModels中。儘管我會說,只要所有閱讀代碼的人都能理解它,只要你把代碼放在哪裏就行了。