Example #1
0
        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));
                }
            }
        }