private async Task DoPrint() { using (new CursorWait(this, true)) { try { await Task.WhenAll(cmdPrint.DoThreadSafeAsync(() => cmdPrint.Enabled = false), prgProgress.DoThreadSafeAsync(() => { prgProgress.Value = 0; prgProgress.Maximum = treCharacters.Nodes.Count; })); Character[] lstCharacters = new Character[treCharacters.Nodes.Count]; // Parallelized load because this is one major bottleneck. Parallel.For(0, lstCharacters.Length, (i, objState) => { if (_objPrinterCancellationTokenSource.IsCancellationRequested || objState.ShouldExitCurrentIteration) { if (!objState.IsStopped) { objState.Stop(); } _objPrinterCancellationTokenSource?.Cancel(false); return; } lstCharacters[i] = Program.MainForm.LoadCharacter(treCharacters.Nodes[i].Tag.ToString(), string.Empty, false, false, false); bool blnLoadSuccessful = lstCharacters[i] != null; if (_objPrinterCancellationTokenSource.IsCancellationRequested || objState.ShouldExitCurrentIteration) { if (!objState.IsStopped) { objState.Stop(); } _objPrinterCancellationTokenSource?.Cancel(false); return; } if (blnLoadSuccessful) { prgProgress.DoThreadSafe(() => ++ prgProgress.Value); } }); if (_objPrinterCancellationTokenSource.IsCancellationRequested) { return; } CleanUpOldCharacters(); if (_objPrinterCancellationTokenSource.IsCancellationRequested) { return; } _aobjCharacters = lstCharacters; if (_frmPrintView == null) { await this.DoThreadSafeFunc(async() => { _frmPrintView = new CharacterSheetViewer(); await _frmPrintView.SetSelectedSheet("Game Master Summary"); await _frmPrintView.SetCharacters(_aobjCharacters); _frmPrintView.Show(); }); } else { await _frmPrintView.DoThreadSafeFunc(async() => { await _frmPrintView.SetCharacters(_aobjCharacters); _frmPrintView.Activate(); }); } } finally { await Task.WhenAll(cmdPrint.DoThreadSafeAsync(() => cmdPrint.Enabled = true), prgProgress.DoThreadSafeAsync(() => prgProgress.Value = 0)); } } }
private async Task DoPrint() { using (CursorWait.New(this, true)) { try { await Task.WhenAll(cmdPrint.DoThreadSafeAsync(x => x.Enabled = false), prgProgress.DoThreadSafeAsync(objBar => { objBar.Value = 0; objBar.Maximum = treCharacters.Nodes.Count; })); // Parallelized load because this is one major bottleneck. Character[] lstCharacters = new Character[treCharacters.Nodes.Count]; Task <Character>[] tskLoadingTasks = new Task <Character> [treCharacters.Nodes.Count]; for (int i = 0; i < tskLoadingTasks.Length; ++i) { string strLoopFile = treCharacters.Nodes[i].Tag.ToString(); tskLoadingTasks[i] = Task.Run(() => InnerLoad(strLoopFile), _objPrinterCancellationTokenSource.Token); } async Task <Character> InnerLoad(string strLoopFile) { if (_objPrinterCancellationTokenSource.IsCancellationRequested) { _objPrinterCancellationTokenSource?.Cancel(false); return(null); } Character objReturn = await Program.LoadCharacterAsync(strLoopFile, string.Empty, false, false, false); bool blnLoadSuccessful = objReturn != null; if (_objPrinterCancellationTokenSource.IsCancellationRequested) { _objPrinterCancellationTokenSource?.Cancel(false); return(null); } if (blnLoadSuccessful) { await prgProgress.DoThreadSafeAsync(() => ++ prgProgress.Value); } return(objReturn); } await Task.WhenAll(tskLoadingTasks); if (_objPrinterCancellationTokenSource.IsCancellationRequested) { return; } try { for (int i = 0; i < lstCharacters.Length; ++i) { lstCharacters[i] = await tskLoadingTasks[i]; } } catch (TaskCanceledException) { return; // We cancelled the task, so just exit } if (_objPrinterCancellationTokenSource.IsCancellationRequested) { return; } await CleanUpOldCharacters(); if (_objPrinterCancellationTokenSource.IsCancellationRequested) { return; } _aobjCharacters = lstCharacters; if (_frmPrintView == null) { await this.DoThreadSafeAsync(async() => { _frmPrintView = new CharacterSheetViewer(); await _frmPrintView.SetSelectedSheet("Game Master Summary"); await _frmPrintView.SetCharacters(_aobjCharacters); _frmPrintView.Show(); }); } else { await _frmPrintView.DoThreadSafeAsync(async objSheetViewer => { await objSheetViewer.SetCharacters(_aobjCharacters); objSheetViewer.Activate(); }); } } finally { await Task.WhenAll(cmdPrint.DoThreadSafeAsync(x => x.Enabled = true), prgProgress.DoThreadSafeAsync(x => x.Value = 0)); } } }