private void ProcessThreadedScriptStatus(object runnerObj) { try { StatusReportRunner runner = (StatusReportRunner)runnerObj; runner.RetrieveStatus(); } finally { lock (StatusReporting.SyncObj) { StatusReporting.SyncObj.WorkingRunners--; } } }
public string GetScriptStatus(ref BackgroundWorker bgWorker, string fileName, ReportType reportType) { foreach (ServerData srv in multiDbData) { foreach (List <DatabaseOverride> ovr in srv.OverrideSequence.Values) { threadTotal++; lock (StatusReporting.SyncObj) { StatusReporting.SyncObj.WorkingRunners++; } StatusReportRunner runner = new StatusReportRunner(this.buildData, srv.ServerName, ovr, projectFilePath); runners.Add(runner); System.Threading.ThreadPool.QueueUserWorkItem(ProcessThreadedScriptStatus, runner); } } int counter = 0; while (StatusReporting.SyncObj.WorkingRunners > 0) { System.Threading.Thread.Sleep(100); counter++; if (bgWorker != null && (counter % 2 == 0)) { bgWorker.ReportProgress(StatusReporting.SyncObj.WorkingRunners, String.Format("Threads remaining: {0}", StatusReporting.SyncObj.WorkingRunners.ToString())); } } if (bgWorker != null) { bgWorker.ReportProgress(0, "Collating Results..."); } ServerStatusDataCollection coll = new ServerStatusDataCollection(); coll.BuildFileNameFull = this.buildZipFileName; foreach (StatusReportRunner runner in this.runners) { coll[runner.ServerName][runner.BaseDatabase] = runner.Status; } return(GenerateReport(coll, fileName, reportType)); }