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); }