我正在尋找在圖層之間進行異步通信的最佳實踐。 我使用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
不會讓任務模式更容易閱讀嗎?當然,與異步/等待.. – JustAnotherUserYouMayKnow 2013-02-19 09:25:10
,但據我所知只是因爲.net 4.5可用?!? – 2013-02-19 09:52:32
有一個NuGet包可以支持4.0和silverlight 5.將它安裝到您的項目中,它就像一個魅力! http://nuget.org/packages/Microsoft.CompilerServices.AsyncTargetingPack/ – JustAnotherUserYouMayKnow 2013-02-19 12:21:12