1

ユーザーの入力に基づいて実行する ExecuteCommand という関数があります。これらのことは、単純に Console.Writeline() を実行したり、フォームのチェック ボックスをオンにしたり、別のプロセスへのキーストロークをシミュレートしたりして、自分自身とは完全に独立しています。関数は別のスレッドで実行されるため、UI を変更するには呼び出しが必要になります。私には 2 つの方法があります... そのうちの 1 つは良い方法かどうかわかりませんが、非常に簡単です。

以下のコード、3行目は私が質問したいものです:

private void ExecuteCommand()
{
   this.Invoke((MethodInvoker)delegate()
   {
      if (current_line_index < command_que.Count)
      {
         current_line = command_que[current_line_index];

         if (current_line.StartsWith(">>Auto Enter"))
         {
            chkAutoEnter.Checked = false;
         }
         else if (current_line.StartsWith("+WinWait("))
         {
            string title_to_wait_for = current_line;

            title_to_wait_for = title_to_wait_for.Remove(0, "+WinWait(\"".Length);          
            title_to_wait_for = title_to_wait_for.Remove(title_to_wait_for.Length - 2, 2);

            t_WinWait = new Thread(() => WinWait(title_to_wait_for));
            t_WinWait.Name = "WinWait";
            t_WinWait.Start();
         }
      }
   });
}

コードは完全に機能します...しかし、それが良い習慣かどうかはわかりません。

または、次のような方法で UI を変更できることもわかっています。

private delegate void CheckCheckBoxHandler(bool checked);

private void CheckCheckBox(bool checked)
{
   if (this.chkAutoEnter.InvokeRequired)
   {
       this.chkAutoEnter.Invoke(new CheckCheckBoxHandler(this.CheckCheckBox), checked);
   }
   else
   {
       chkAutoEnter.Checked = checked;
   }
}

しかし、別のスレッドから変更されるフォームに複数のコントロールがあるため、最初の例の単純な方法とは対照的に、それを行うには多数の関数を追加する必要があります。

とにかく最初の方法は悪いですか?まだ遭遇していないリスクはありますか? 本当でよさそうですね…

ありがとう!

4

1 に答える 1

5

いいえ、悪くありません。Invokeそれらはすべて同じ効果を持つため、 どのコントロールを呼び出すかは問題ではありません。Invokeコントロールを所有するスレッドでデリゲートを呼び出します-すべてのコントロールが同じスレッドによって所有されている限り、違いはありません。

于 2013-08-03T03:09:33.010 に答える