public void StartSolver() { worker = new BackgroundWorker(); worker.WorkerReportsProgress = true; worker.ProgressChanged += (s, e) => { if (ProgressUpdate != null) { ProgressUpdate(this, new ProgressArgs((string)e.UserState)); } }; worker.RunWorkerCompleted += (s, e) => { if (Finished != null) { Finished(this); } }; worker.DoWork += makeMoves; // Is Initial try { if (parser.ParseScreen(this, out this.nonZeroValues)) { // Start in middle of screen new Movement(new Block(Width / 2, Height / 2, BlockState.Unknown), MoveTypes.DoubleClick).Execute(parser); Thread.Sleep(500); } } catch (ParserException ex2) { if (ProgressUpdate != null) { ProgressUpdate(this, new ProgressArgs(ex2.Message)); } return; } worker.RunWorkerAsync(); }