Poszukuję najlepszej praktyki do komunikacji asynchronicznej między warstwami. Używam mvvm light toolkitco jest asynchroniczne w MVVM? Model lub ViewModel. Najlepsza praktyka?
obecnie używam BackgroundWorker w modelu bo widziałem ten kod wygenerowany automatycznie. Nie w tle, ale w asynchronicznym wywołaniu.
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();
}
Teraz znalazłem AsyncDelegateCommand który implementuje asynchroniczny udział w ViewModel.
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));
}
}
Jestem trochę zdezorientowany co do najlepszej praktyki? Czytałem dużo artykułów. Ale jakoś zawsze są to różne opinie. Czy istnieje jakiś przepis na najlepszą kompatybilność przy normalnym wysiłku, aby utrzymać?
Niektórzy do myślenia
Model:
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
http://www.codeproject.com/Articles/441752/Async-MVVM-Modern-UI
Czy wzór zadania nie byłby łatwiejszy do odczytania? Z async/poczekaj .. – JustAnotherUserYouMayKnow
oczywiście, ale o ile mi wiadomo, to tylko od .net 4.5 dostępne?!? –
Istnieje pakiet NuGet do obsługi wersji 4.0 i silverlight 5. Zainstaluj go w swoim projekcie i działa jak urok! http://nuget.org/packages/Microsoft.CompilerServices.AsyncTargetingPack/ – JustAnotherUserYouMayKnow