私はTile
の多次元配列を持っています。Dispatcherは配列から最後のオブジェクトのみを描画します
私のプログラムは、ランダムな位置(例:(0,0))のランダムなアドレスTile
を訪問し、訪れたとマークし、利用可能な未訪問のネイバーがなくなるまで次のネイバーに移動します。
これは私のコードです:
while (HasUnvisitedNeighbours())
{
Task.Run(() =>
{
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
CurrentTile.Draw();
}));
Thread.Sleep(500);
});
//1. Choose randomly a neighbour
List<char> Keys = new List<char>(CurrentTile.Neighbours.Keys);
char randomKey = Keys[rnd.Next(Keys.Count)];
CurrentTile = CurrentTile.Neighbours[randomKey];
CurrentTile.HasBeenVisited = true;
}
私は私のプログラムを通じてデバッグきた、と私はいることが確認されました:
CurrentTile = CurrentTile.Neighbours[randomKey];
が正しく正しい隣人に各ループを変更し、ループすることをその隣に未訪問の隣人がいないときに停止する。
しかし中:
Task.Run(() =>
{
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
CurrentTile.Draw();
}));
Thread.Sleep(500);
});
CurrentTile.Draw()
は常に(デバッガで、CurrentTile = CurrentTile.Neighbours[randomKey];
の最後の値を同じ値を持っているように見える、全体のループのディスパッチャ待機が終了しているようだし、それを描くようにします。最後Tile
オブジェクト
私の意図は、現在のTile
描画することです - 。あなた> ...
ああ、私は最初に言うのではなく、最後の 'Tile'をキューに入れるのはなぜでしょうか?また、私が取った道を描きたいのであれば、これは間違った実装ですか?私もdispatcherTimerを試しましたが、それは最初のダニで図面を作った。 – BaronSensei
http://stackoverflow.com/questions/1526678/does-using-dispatcher-invoke-make-my-thread-safe .... Windowsのmessageloopディスパッチャの動作方法の説明です。 –
最後のタイルのみですCurrentTileはループから出てきたときに最後のタイルに設定されているため、描画されます。ループから出て、CurrentTile.Draw()が呼び出されるときだけです。現在のタイルはその時点で最後のタイルを含みます.....あなたの第1、第2、第3などではありません。あなたの "beginvoke"は待ち行列に入れられているだけで、次の「ディスパッチャ」が許可される/それを処理する周りにいる時間。 –