Ich suche nach der besten Methode, um asynchron zwischen den Schichten zu kommunizieren. Ich verwende die mvvm light toolkitWas ist in MVVM asynchron? Das Modell oder ViewModel. Beste Übung?
zur Zeit ich einen Background imModell verwenden, da ich dies in dem automatisch generierten Code sah. Nicht mit dem Hintergrundarbeiter, sondern der Async-Aufruf.
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();
}
Nun fand ich die AsyncDelegateCommand, die den asynchronen Teil im Ansichtsmodell implementiert.
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));
}
}
Ich bin ein wenig verwirrt über die beste Praxis? Ich habe viele Artikel gelesen. Aber irgendwie sind sie immer unterschiedliche Meinungen. Gibt es irgendwelche Vorkehrungen, um die beste Kompatibilität bei normalem Aufwand zu erhalten?
Einige Denkanstösse
Modell:
http://csharperimage.jeremylikness.com/2009/12/simplifying-asynchronous-calls-in.html
http://www.dzone.com/articles/mvvmlight-and-async
Ansichtsmodell
http://www.codeproject.com/Articles/123183/Asynchronus-MVVM-Stop-the-Dreaded-Dead-GUI-Problem
http://www.codeproject.com/Articles/441752/Async-MVVM-Modern-UI
Wäre das Aufgabenmuster nicht viel einfacher zu lesen? Mit async/erwarten .. – JustAnotherUserYouMayKnow
natürlich, aber soweit ich weiß ist es erst seit .net 4.5 verfügbar?!? –
Es gibt ein NuGet-Paket, um es für 4.0 und Silverlight zu unterstützen. 5. Installieren Sie es in Ihr Projekt und es funktioniert wie ein Zauber! http://nuget.org/packages/Microsoft.CompilerServices.AsyncTargetingPack/ – JustAnotherUserYouMayKnow