Try this out for size: http://amazedsaint.blogspot.com/2010/10/asynchronous-delegate-command-for-your.html. Great for testing as well, as none of your methods need to be Asynchronous, you just execute your Async Command.
I edited it slightly to extend the DelegateCommand so I could call RaiseCanExecuteChanged() method, as below:
public class AsyncDelegateCommand : DelegateCommand, ICommand
{
BackgroundWorker _worker = new BackgroundWorker();
Func<bool> _canExecute;
/// <summary>
/// The constructor
/// </summary>
/// <param name="action">The action to be executed</param>
/// <param name="canExecute">Will be used to determine if the action can be executed</param>
/// <param name="completed">Will be invoked when the action is completed</param>
/// <param name="error">Will be invoked if the action throws an error</param>
public AsyncDelegateCommand(Action action,
Func<bool> canExecute = null,
Action<object> completed = null,
Action<Exception> error = null
) : base(action, canExecute)
{
...
}
}
Hope that's of help.