3

if ステートメントと else ステートメントがこの関数でどのように関連しているか教えてください。別のスレッドから GUI スレッドにテキストを表示しています。実行の順序または方法は何ですか。else文は必要ですか?

delegate void SetTextCallback(string text);

    private void SetText(string text)
    {
        // InvokeRequired required compares the thread ID of the
        // calling thread to the thread ID of the creating thread.
        // If these threads are different, it returns true.
        if (this.textBox7.InvokeRequired)
        {
            SetTextCallback d = new SetTextCallback(SetText);
            this.Invoke(d, new object[] { text });
        }
        else
        {
            this.textBox7.Text = text;
        }
    }
4

4 に答える 4

4
  1. もう一方のスレッドは SetText を呼び出します
  2. フォームを作成したのはスレッドではないため、必要Invokeです。
  3. this.Invoke指定されたパラメータで SetText を再度呼び出します。こちらもチェック
  4. SetText が UI スレッドから呼び出されるようになり、Invoke を実行する必要がなくなりました。
  5. ブロックでは、elseテキストがスレッドセーフに設定されていることを確認しています
于 2013-02-05T09:53:41.540 に答える
2

InvokeRequiredステートメントがメインの UI スレッドで実行されているか、UI スレッド以外のスレッドで実行されているかを確認するために使用されます。

ステートメントが UI スレッド以外のスレッドで実行されている場合は、例外Invokeが発生しないように使用されます。CrossThread

于 2013-02-05T09:52:07.470 に答える
2

else必ず必要です。

このコードが行うことはSetText、どのスレッドからでも安全に呼び出すことができるようにすることです。UI スレッド (ブロック) 以外のスレッドから呼び出した場合、ifその呼び出しを透過的に UI スレッド (ブロック) に転送しますelse。これは、コントロールにアクセスしてテキストを読み取ったり設定したりできる唯一のスレッドです。

this.textBox7.TextUI スレッドで実行しないと、やみくもに実行すると例外が発生します。

于 2013-02-05T09:52:28.143 に答える
1

他の回答に追加するために、これは一般的なパターンです(特に、呼び出されたメソッドにかなりの量のロジックが含まれるシナリオでは)- InvokeRequiredtrue を返す場合、UI スレッドから同じメソッドにコールバックします。

private void SetText(string text)
{
    if (InvokeRequired)
        BeginInvoke(new Action<string>((t) => SetText(text)));
    else
        textBox7.Text = text;
}

ifそうすれば、との両方でロジックを繰り返す必要はありませんelse

于 2013-02-05T09:57:17.353 に答える