The default implementation of the ActionMessage.PrepareContext does not enforce thread affinity whenever an action guard changes:
PropertyChangedEventHandler handler = null;
handler = (s, e) =>
if (string.IsNullOrEmpty(e.PropertyName) || e.PropertyName == guardName)
if (context.Message == null)
inpc.PropertyChanged -= handler;
If a guard changes as a consequence of an asynchronous operation, this line
will try to manipulate a DependencyObject, throwing an exception.
Wrapping such call into an Execute.OnUIThread seems to me the best approach, considering that property change notification are often silently marshalled on the UI thread (consider the Binding mechanism).
Note that such modification can be implemented as a customization, nevertheless I think that the current approach bears no benefits, while changing the default implementation causes no harm.