Esempio n. 1
0
        private void DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;
            bool             failed = false;

            MazeSolver solver = CreateSolver();

            solver.Stage += SolverOnStage;
            solver.SolveMaze(Maze.Value, SourceCell.Value, TargetCell.Value);
            solver.Stage -= SolverOnStage;

            if (!failed)
            {
                e.Result = solver;
            }

            void SolverOnStage(ProgressStage stage, Maze maze, float percentage)
            {
                if (worker.CancellationPending && (stage == ProgressStage.Started || stage == ProgressStage.Ongoing))
                {
                    e.Cancel = true;
                    solver.Cancel();
                }

                switch (stage)
                {
                case ProgressStage.Failed:
                    failed = true;
                    break;

                case ProgressStage.Ongoing:
                    worker.ReportProgress((int)percentage);
                    break;
                }
            }
        }