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; } } }