MVVM with Async - sample code
How do you combine MVVM with async? -- Well, really, there's not much to it. Just the same as always. Here's an example Silverlight MVVM project. It first shipped with the Async CTP, and I've updated it to use VS2012 and Microsoft.Bcl.Async.
- Download AsyncMVVM-Silverlight-VB.zip [2mb, requires VS2012]
- Download AsyncMVVM-Silverlight-CS.zip [2mb, requires VS2012]
One thing that makes it easier with async/await is that these keywords don't introduce new threads. This makes things a lot easier. It means that all your work can be done on the UI thread: even when you update databound properties, or add elements to a databound observable collection, it's all on the UI thread and so works fine.
I just want to call out ICommand.Execute. We all know that async voids should only be used for top-level event-handlers, or event-like things. Well, ICommand.Execute is an top-level event-like thing, so it's okay for it to be async void. Just remember that all exceptions that come out of an async void will be posted straight to the UI thread.
Public Class FetchCommand
Friend vm As MainPageViewModel
Friend Sub Invalidate()
RaiseEvent CanExecuteChanged(Me, EventArgs.Empty)
Public Function CanExecute(p As Object) As Boolean Implements ICommand.CanExecute
Return Not vm.Fetching
Public Event CanExecuteChanged(s As Object, e As EventArgs) Implements ICommand.CanExecuteChanged
Public Sub Execute(parameter As Object) Implements ICommand.Execute
vm.DoFetch() ' DoFetch is an Async Sub (i.e. void-returning async)