Sto cercando la procedura migliore per comunicare in modo asincrono tra i livelli. Sto utilizzando la mvvm light toolkitche cosa è asincrono in MVVM? Il modello o ViewModel. Miglior pratica?
Attualmente io uso un BackgroundWorker nel modelloperché ho visto questo nel codice generato automaticamente. Non con il backgroundworker ma con la chiamata asincrona.
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();
}
Ora ho trovato la AsyncDelegateCommand che implementa la parte asincrona nel 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));
}
}
Sono un po 'confuso riguardo alle migliori pratiche? Ho letto molti articoli Ma in qualche modo sono sempre opinioni diverse. C'è qualche misura per la migliore compatibilità con il normale sforzo di manutenzione?
alcuni spunti di riflessione
Modello:
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
Non sarebbe più facile leggere la sequenza di attività? Con asincrono/attendo .. – JustAnotherUserYouMayKnow
ovviamente, ma per quanto ne so è solo da. Net 4.5 disponibile?!? –
C'è un pacchetto NuGet per supportarlo per 4.0 e silverlight 5. Installalo nel tuo progetto e funziona come un incantesimo! http://nuget.org/packages/Microsoft.CompilerServices.AsyncTargetingPack/ – JustAnotherUserYouMayKnow