private async void ExecuteItemAsync(IExecutable item) { if (MessageBox.Show(string.Format(Properties.Resources.MainFormExecutePrompt, item.Name), Properties.Resources.MainFormExecuteTitle, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { DateTime startedOn = DateTime.Now; try { ValidationResult validationResult = item.Validate(); if (validationResult.IsValid) { CancellationTokenSource cancel = new CancellationTokenSource(); Progress <ExecutionProgress> progress = new Progress <ExecutionProgress>(); ApplicationState.Default.NotifyAsyncProcessStarted(cancel, progress, item.ItemCount); await Task.Run(() => item.Execute(cancel.Token, progress)); ApplicationState.Default.RaiseNotification(new NotificationEventArgs(NotificationType.Information, string.Format(Properties.Resources.MainFormExecuteSucceeded, item.Name, ClientUtility.GetDurationString(DateTime.Now - startedOn)))); ApplicationState.Default.NotifyAsyncProgressStopped(true); } else { validationResult.Errors.ForEach(error => ApplicationState.Default.RaiseNotification(new NotificationEventArgs(NotificationType.Error, error.Message))); } } catch (OperationCanceledException) { ApplicationState.Default.RaiseNotification(new NotificationEventArgs(NotificationType.Warning, string.Format(Properties.Resources.MainFormExecuteStopped, item.Name, ClientUtility.GetDurationString(DateTime.Now - startedOn)))); ApplicationState.Default.NotifyAsyncProgressStopped(false); } catch (Exception ex) { ApplicationState.Default.RaiseNotification(new NotificationEventArgs(NotificationType.Error, ex.Message, ex)); ApplicationState.Default.NotifyAsyncProgressStopped(false); } } }