public void RunWorker()
            {
                var stagingUI = new StagingUIController()
                {
                    Modal = true
                };

                Staging staging = null;
                var     worker  = new BackgroundWorker()
                {
                    WorkerSupportsCancellation = true
                };

                worker.DoWork += (s, e) => {
                    var stageResult = new List <string> ();
                    for (int i = 0; i < 500; i++)
                    {
                        stageResult.Add(
                            $"Worker {i} started at {DateTime.Now}");
                        e.Result = stageResult;
                        Thread.Sleep(1);
                        if (worker.CancellationPending)
                        {
                            e.Cancel = true;
                            return;
                        }
                    }
                };

                worker.RunWorkerCompleted += (s, e) => {
                    if (e.Error != null)
                    {
                        // Failed
                        WriteLog($"Exception occurred {e.Error.Message} on Worker {staging.StartStaging}.{staging.StartStaging:fff} at {DateTime.Now}");
                    }
                    else if (e.Cancelled)
                    {
                        // Canceled
                        WriteLog($"Worker {staging.StartStaging}.{staging.StartStaging:fff} was canceled at {DateTime.Now}!");
                    }
                    else
                    {
                        // Passed
                        WriteLog($"Worker {staging.StartStaging}.{staging.StartStaging:fff} was completed at {DateTime.Now}.");
                        Application.Refresh();

                        var stagingUI = new StagingUIController(staging, e.Result as List <string>)
                        {
                            Modal = false,
                            Title = $"Worker started at {staging.StartStaging}.{staging.StartStaging:fff}",
                            Data  = $"{staging.StartStaging}.{staging.StartStaging:fff}"
                        };

                        stagingUI.ReportClosed += StagingUI_ReportClosed;

                        if (stagingsUI == null)
                        {
                            stagingsUI = new List <StagingUIController> ();
                        }
                        stagingsUI.Add(stagingUI);
                        stagingWorkers.Remove(staging);

                        stagingUI.Run();
                    }
                };

                Application.Run(stagingUI);

                if (stagingUI.Staging != null && stagingUI.Staging.StartStaging != null)
                {
                    staging = new Staging(stagingUI.Staging.StartStaging);
                    WriteLog($"Worker is started at {staging.StartStaging}.{staging.StartStaging:fff}");
                    if (stagingWorkers == null)
                    {
                        stagingWorkers = new Dictionary <Staging, BackgroundWorker> ();
                    }
                    stagingWorkers.Add(staging, worker);
                    worker.RunWorkerAsync();
                    stagingUI.Dispose();
                }
            }
 private void StagingUI_ReportClosed(StagingUIController obj)
 {
     WriteLog($"Report {obj.Staging.StartStaging}.{obj.Staging.StartStaging:fff} closed.");
     stagingsUI.Remove(obj);
 }
            private void RunWorker()
            {
                worker = new BackgroundWorker()
                {
                    WorkerSupportsCancellation = true
                };

                var cancel = new Button("Cancel Worker");

                cancel.Clicked += () => {
                    if (worker == null)
                    {
                        log.Add($"Worker is not running at {DateTime.Now}!");
                        listLog.SetNeedsDisplay();
                        return;
                    }

                    log.Add($"Worker {startStaging}.{startStaging:fff} is canceling at {DateTime.Now}!");
                    listLog.SetNeedsDisplay();
                    worker.CancelAsync();
                };

                startStaging = DateTime.Now;
                log.Add($"Worker is started at {startStaging}.{startStaging:fff}");
                listLog.SetNeedsDisplay();

                var md = new Dialog($"Running Worker started at {startStaging}.{startStaging:fff}", cancel);

                md.Add(new Label("Wait for worker to finish...")
                {
                    X = Pos.Center(),
                    Y = Pos.Center()
                });

                worker.DoWork += (s, e) => {
                    var stageResult = new List <string> ();
                    for (int i = 0; i < 500; i++)
                    {
                        stageResult.Add($"Worker {i} started at {DateTime.Now}");
                        e.Result = stageResult;
                        Thread.Sleep(1);
                        if (worker.CancellationPending)
                        {
                            e.Cancel = true;
                            return;
                        }
                    }
                };

                worker.RunWorkerCompleted += (s, e) => {
                    if (md.IsCurrentTop)
                    {
                        //Close the dialog
                        Application.RequestStop();
                    }

                    if (e.Error != null)
                    {
                        // Failed
                        log.Add($"Exception occurred {e.Error.Message} on Worker {startStaging}.{startStaging:fff} at {DateTime.Now}");
                        listLog.SetNeedsDisplay();
                    }
                    else if (e.Cancelled)
                    {
                        // Canceled
                        log.Add($"Worker {startStaging}.{startStaging:fff} was canceled at {DateTime.Now}!");
                        listLog.SetNeedsDisplay();
                    }
                    else
                    {
                        // Passed
                        log.Add($"Worker {startStaging}.{startStaging:fff} was completed at {DateTime.Now}.");
                        listLog.SetNeedsDisplay();
                        Application.Refresh();
                        var builderUI = new StagingUIController(startStaging, e.Result as List <string>);
                        builderUI.Load();
                    }
                    worker = null;
                };
                worker.RunWorkerAsync();
                Application.Run(md);
            }