protected void ManageProgress(BindingSource bindingSource, DoubleBufferedDataGridView grid, FrameType frameType, int sleepTimer) { var progress = new Progress(); progress.SetupAndShow(caller, 0, 0, false, true, waitHandle); progressSearched = 0; progressFound = 0; UpdateGridDelegate gridUpdater = UpdateGrid; var updateParams = new object[] {bindingSource}; ResortGridDelegate gridSorter = ResortGrid; var sortParams = new object[] {bindingSource, grid, frameType}; SetButtonDelegate setButton = SetGenerateButton; try { bool alive = true; while (alive) { progress.ShowProgress(progressSearched/(float) progressTotal, progressSearched, progressFound); if (refreshQueue) { caller.Invoke(gridUpdater, updateParams); refreshQueue = false; } if (jobs != null) { foreach (Thread job in jobs) { if (job != null && job.IsAlive) { alive = true; break; } alive = false; } } if (sleepTimer > 0) Thread.Sleep(sleepTimer); } } catch (ObjectDisposedException) { // This keeps the program from crashing when the Time Finder progress box // is closed from the Windows taskbar. } catch (Exception exception) { if (exception.Message != "Operation Cancelled") { throw; } } finally { progress.Finish(); if (jobs != null) { foreach (Thread t in jobs) { if (t != null) { t.Abort(); } } } caller.Invoke(setButton, true); caller.Invoke(gridSorter, sortParams); } }