The latest cut of the Apex Code (http://apex.codeplex.com/SourceControl/changeset/changes/6701) contains a very cool new feature - Asynchronous Command Objects.

An Asynchronous Command is a ViewModelCommand - the standard object used in Apex for commanding. However, what is different about this function is that it runs Asynchronously.

One of the problems with running a view model command asynchronously is that generally the view model properties cannot be accessed - as they're created on a different dispatcher. This problem is resolved by using the 'ReportProgress' function. Here's an example:

public class SomeViewModel : ViewModel  
{
  public SomeViewModel()
  {
     // Create the command.
     asyncCommand = new AsynchronousCommand(DoAsyncCommand, true);
  }

  private void DoAsyncCommand()
  {
     for(int i = 0; i < 100; i++)
     {
        // Perform some long operation.
        string message = DoSomeLongOperation();

        // Add the message to the View Model - safely!
        asyncCommand.ReportProgress(
          () =>
          {
             messages.Add(message);
          }
        );
     }
  }

  private ObservableCollection<string> messages =
    new ObservableCollection<string>();

  public ObservableCollection<string> Messages
  {
     get { return messages; }
  }

  private AsynchronousCommand asyncCommand;

  public AsynchronousCommand AsyncCommand
  {
     get { return asyncCommand; }
  }
}

In this basic mock-up we have a command called 'AsyncCommand' (which we could bind a button to for example) which invokes DoAsyncCommand. However, it invokes it Asynchronously. We can also update the ViewModel properties by using ReportProgress - meaning AsyncCommands can seamlessly provide live feedback while they're working - and we're keeping well locked in with the MVVM commanding model!

Expect a full article soon on the CodeProject, until then the source is at:

http://apex.codeplex.com/SourceControl/changeset/changes/6701