/// <summary> /// Executes the asynchronous command. Any exceptions from the asynchronous delegate are captured and placed on <see cref="Execution"/>; they are not propagated to the UI loop. /// </summary> /// <param name="parameter">The parameter for the command.</param> public override async Task ExecuteAsync(object parameter) { var tcs = new TaskCompletionSource <object>(); Execution = NotifyTask.Create(DoExecuteAsync(tcs.Task, _executeAsync, parameter)); var propertyChanged = PropertyChanged; propertyChanged?.Invoke(this, PropertyChangedEventArgsCache.Instance.Get("Execution")); propertyChanged?.Invoke(this, PropertyChangedEventArgsCache.Instance.Get("IsExecuting")); tcs.SetResult(null); await Execution.TaskCompleted; PropertyChanged?.Invoke(this, PropertyChangedEventArgsCache.Instance.Get("IsExecuting")); }
/// <summary> /// Executes the asynchronous command. Any exceptions from the asynchronous delegate are captured and placed on <see cref="Execution"/>; they are not propagated to the UI loop. /// </summary> /// <param name="parameter">The parameter for the command.</param> public override async Task ExecuteAsync(object parameter) { Execution = NotifyTask.Create(_executeAsync(parameter)); if (_canExecute == null) { base.OnCanExecuteChanged(); } var propertyChanged = PropertyChanged; propertyChanged?.Invoke(this, PropertyChangedEventArgsCache.Instance.Get("Execution")); propertyChanged?.Invoke(this, PropertyChangedEventArgsCache.Instance.Get("IsExecuting")); await Execution.TaskCompleted; if (_canExecute == null) { base.OnCanExecuteChanged(); } PropertyChanged?.Invoke(this, PropertyChangedEventArgsCache.Instance.Get("IsExecuting")); await Execution.Task; }