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