0

私はこれで少し初心者ですが、リバーシ ゲームの UI を移動選択部分とは別のスレッドで実行しようとしていますが、ボタン クリックでスレッドを呼び出すのに問題があります。

private void playerMoveOKButton_Click(object sender, EventArgs e)
{
       ReversiT.Invoke();
}

public void ReversiT() {...}
4

5 に答える 5

1

新しいスレッドを作成しようとしている場合は、次のようにすることができます。

Thread thread = new Thread(ReversiT);
thread.Start();

ただし、呼び出しは別の目的で使用されます。特定のスレッドでメソッドを実行するために使用されます (たとえば、別のスレッドでコードを実行しているが、UI を変更したい場合は、Invoke を使用して UI スレッドでそれらの変更を行う必要があります)。

于 2012-11-26T12:59:25.957 に答える
0

ここで実際に達成しようとしていることを考える必要があると思います。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 スレッドの外部で発生する可能性があることは実際にはほとんどないため、スレッドを使用しても何も得られないことがわかる場合があります。

于 2012-11-26T13:43:00.450 に答える
0

そのようなメソッドを呼び出すことはできません。デリゲートのみを呼び出すことができます。また、呼び出しInvokeても新しいスレッドは生成されません。

デリゲートに関するこのチュートリアルと、スレッドに関するこのチュートリアルを読むことができます。また、あなたの質問には議論の余地がたくさんあります:

  1. スレッドの使用に何を期待しますか?
  2. バックグラウンド作業を行うためのさまざまなオプションを検討しましたか?

于 2012-11-26T12:56:19.467 に答える
0

BackgroundWorkermove メソッドを呼び出すイベントを設定して、すべてを処理する を作成しDoWorkます (move メソッドが UI に触れないようにするか、必要な場合は UI スレッドでコントロールを呼び出します)。

RunWorkerCompletedまた、BackgroundWorker のイベントで UI を更新するメソッドも設定します。

上記のボタン クリック イベントで、BGW のRunWorkerAsync()メソッドを呼び出します。

于 2012-11-26T13:02:01.603 に答える