私はこれで少し初心者ですが、リバーシ ゲームの UI を移動選択部分とは別のスレッドで実行しようとしていますが、ボタン クリックでスレッドを呼び出すのに問題があります。
private void playerMoveOKButton_Click(object sender, EventArgs e)
{
ReversiT.Invoke();
}
public void ReversiT() {...}
私はこれで少し初心者ですが、リバーシ ゲームの UI を移動選択部分とは別のスレッドで実行しようとしていますが、ボタン クリックでスレッドを呼び出すのに問題があります。
private void playerMoveOKButton_Click(object sender, EventArgs e)
{
ReversiT.Invoke();
}
public void ReversiT() {...}
新しいスレッドを作成しようとしている場合は、次のようにすることができます。
Thread thread = new Thread(ReversiT);
thread.Start();
ただし、呼び出しは別の目的で使用されます。特定のスレッドでメソッドを実行するために使用されます (たとえば、別のスレッドでコードを実行しているが、UI を変更したい場合は、Invoke を使用して UI スレッドでそれらの変更を行う必要があります)。
ここで実際に達成しようとしていることを考える必要があると思います。UI の別のスレッドでコードを実行することは、UI のハングを防ぐために使用される手法です。ただし、一部のタスクは単に UI スレッドで実行する必要があるため、別のスレッドから実行することはできません。
UI スレッドで実行する必要がある部分 (UI 上のコントロールとやり取りするもの) を識別できるように、ロジックを分割する必要があります。したがって、別のスレッドで実行できるものはすべて識別できます。
(例として)次のようなコードになります。
private void playerMoveOKButton_Click(object sender, EventArgs e)
{
//thread is merely used as an example
//you could also use a BackgroundWorker or a task
var thread = new Thread(NonUiLogic);
thread.Start();
}
private void NonUiLogic()
{
...
//execute logic that doesn't touch UI
...
BeginInvoke(ReversiT);
}
public void ReversiT() {...}
この演習を完了すると、UI スレッドの外部で発生する可能性があることは実際にはほとんどないため、スレッドを使用しても何も得られないことがわかる場合があります。
BackgroundWorker
move メソッドを呼び出すイベントを設定して、すべてを処理する を作成しDoWork
ます (move メソッドが UI に触れないようにするか、必要な場合は UI スレッドでコントロールを呼び出します)。
RunWorkerCompleted
また、BackgroundWorker のイベントで UI を更新するメソッドも設定します。
上記のボタン クリック イベントで、BGW のRunWorkerAsync()
メソッドを呼び出します。