public static void Execute(Window owner, string label, Action operation, Action <ProgressDialogResult> successOperation, Action <ProgressDialogResult> failureOperation = null, Action <ProgressDialogResult> cancelledOperation = null) { ProgressDialogResult result = ExecuteInternal(owner, label, operation, null); if (result.Cancelled && cancelledOperation != null) { cancelledOperation(result); } else if (result.OperationFailed && failureOperation != null) { failureOperation(result); } else if (successOperation != null) { successOperation(result); } }
public ProgressDialogResult Execute(object operation) { if (operation == null) { throw new ArgumentNullException("operation"); } ProgressDialogResult result = null; _isBusy = true; _worker = new BackgroundWorker(); _worker.WorkerReportsProgress = true; _worker.WorkerSupportsCancellation = true; _worker.DoWork += (s, e) => { if (operation is Action) { ((Action)operation)(); } else if (operation is Action <BackgroundWorker> ) { ((Action <BackgroundWorker>)operation)(s as BackgroundWorker); } else if (operation is Action <BackgroundWorker, DoWorkEventArgs> ) { ((Action <BackgroundWorker, DoWorkEventArgs>)operation)(s as BackgroundWorker, e); } else if (operation is Func <object> ) { e.Result = ((Func <object>)operation)(); } else if (operation is Func <BackgroundWorker, object> ) { e.Result = ((Func <BackgroundWorker, object>)operation)(s as BackgroundWorker); } else if (operation is Func <BackgroundWorker, DoWorkEventArgs, object> ) { e.Result = ((Func <BackgroundWorker, DoWorkEventArgs, object>)operation)(s as BackgroundWorker, e); } else { throw new InvalidOperationException("Operation type is not supoorted"); } }; _worker.RunWorkerCompleted += (s, e) => { result = new ProgressDialogResult(e); Dispatcher.BeginInvoke(DispatcherPriority.Send, (SendOrPostCallback) delegate { _isBusy = false; Close(); }, null); }; _worker.ProgressChanged += (s, e) => { if (_worker.CancellationPending) { return; } SubLabel = (e.UserState as string) ?? string.Empty; ProgressBar.Value = e.ProgressPercentage; }; _worker.RunWorkerAsync(); ShowDialog(); return(result); }