我将此函数[ makeComputerMove ]与 Task.Factory.StartNew 语句一起使用,以避免在我的WPF应用程序中冻结UI。 我从 while循环调用此函数,我相信我有竞争条件。 我正在寻找一种等待功能补充的方法,然后继续前进。
private void makeComputerMove(PocGraph.Heuristic h, PocGraph.Player p)
{
Node tree = null;
TaskScheduler scheduler = TaskScheduler.FromCurrentSynchronizationContext();
CancellationToken cancelationToken = new CancellationToken();
playLoadingStoryBoard();
Task taskA = Task.Factory.StartNew(() => { tree = vm.buildMovesTree(h, p); }).
ContinueWith(w =>
{
showWaterMarkForComputerMove(h.ToString(), tree.BestMove.Player.ToString(), tree.BestMove.Position);
makeComputerMove(tree.BestMove.Position, tree.BestMove.Player);
stopLoadingStoryBoard();
},
cancelationToken,
TaskContinuationOptions.ExecuteSynchronously, scheduler);
}
While循环:
while (!gameOver() && !vm.Graph.hasWinner() && !vm.Graph.IsInfiniteLoop && isAIrunning)
{
vm.disableDelays = true;
//Black Move
makeComputerMove(blackHeuristic, PocGraph.Player.BLACK);
//Checking if someone won between turns
if (gameOver() || vm.Graph.hasWinner() || vm.Graph.IsInfiniteLoop)
break;
//Pause between Black -> Red
if (!cancelMessageBoxesAndWaiting)
vm.InteractivePauseInMilliSeconds(2000);
makeComputerMove(redHeuristic, PocGraph.Player.RED);
//Pause between Red -> Black
if (!cancelMessageBoxesAndWaiting)
vm.InteractivePauseInMilliSeconds(2000);
}
vm.disableDelays = false;