protected override void TrySolve(Board board, System.Threading.CancellationToken cancellationToken) { var rootBranch = new BoardBranch(board); var solverBlock = new TransformBlock <BoardBranch, BoardBranchSolveResult>( branch => branch.Solve(), new ExecutionDataflowBlockOptions { CancellationToken = cancellationToken, BoundedCapacity = 10, MaxDegreeOfParallelism = 3, SingleProducerConstrained = true }); var checker = new ActionBlock <BoardBranchSolveResult>(result => { var branch = result.Branch; if (board.EmptyCellIndex == 4) { Console.WriteLine(branch.ToString()); } if (result.Solved) { solverBlock.Complete(); //always can solve, branch count of each step count is const } else { foreach (var innerBranch in branch.GetBranches(GetCost)) { solverBlock.Post(innerBranch); } } result.Dispose(); result = null; }, new ExecutionDataflowBlockOptions { CancellationToken = cancellationToken }); var checkerLink = solverBlock.LinkTo(checker); solverBlock.Completion.ContinueWith(t => { checker.Complete(); checkerLink.Dispose(); }); foreach (var branch1 in rootBranch.GetBranches(GetCost)) { solverBlock.Post(branch1); } rootBranch.Dispose(); rootBranch = null; checker.Completion.Wait(); }
public BoardBranchSolveResult(BoardBranch branch, bool solved) { if (branch == null) { throw new ArgumentNullException("branch"); } this.branch = branch; this.solved = solved; }
public void Dispose() { this.branch.Dispose(); this.branch = null; }