예제 #1
0
        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);
                }
            }
        }