public static void RunInBackground(Action backgroundAction, DispatcherObject control, Action uiAction) { BackgroundWorker bgWorker = new BackgroundWorker { WorkerReportsProgress = true, WorkerSupportsCancellation = false }; var arg = new RunInBackgroundArgument() { Control = control, BackgroundAction = backgroundAction, UIAction = uiAction }; bgWorker.DoWork += RunInBackground_DoWork; bgWorker.RunWorkerCompleted += RunInBackground_RunWorkerComplete; bgWorker.RunWorkerAsync(arg); }
private static void RunInBackground_DoWork(object sender, DoWorkEventArgs e) { RunInBackgroundArgument arg = e.Argument as RunInBackgroundArgument; if (arg != null) { var control = arg.Control; var backgroundAction = arg.BackgroundAction; var uiAction = arg.UIAction; if (backgroundAction != null) { try { backgroundAction(); } catch { } e.Result = arg; } } }
private static void RunInBackground_RunWorkerComplete(object sender, RunWorkerCompletedEventArgs e) { RunInBackgroundArgument arg = e.Result as RunInBackgroundArgument; if (arg != null) { var control = arg.Control; var backgroundAction = arg.BackgroundAction; var uiAction = arg.UIAction; if (uiAction != null && control != null) { control.InvokeAsRequired(uiAction); } } var bgWorker = sender as BackgroundWorker; if (bgWorker != null) { bgWorker.DoWork -= RunInBackground_DoWork; bgWorker.RunWorkerCompleted -= RunInBackground_RunWorkerComplete; } }