3

内にいくつかのメソッドを持つクロススレッドアプリケーションを開発していますInvoke:

if (this.InvokeRequired)
{
    this.Invoke((Action)(() =>
    {
        pbTotalProgress.Value = progress;
        labe1.Text="SomeText";
    }));
}
else
{
    pbTotalProgress.Value = progress;
    labe1.Text="SomeText";
}

以下のコードをもう少し短くするにはどうすればよいですか?

4

2 に答える 2

3

少なくとも、アクションは1回だけ定義する必要があります(elseブランチにコードを再度含めるのではなく、呼び出しなしでアクションを実行するだけです。
アクションを呼び出しとして実行するコントロールの拡張メソッドを作成することもできます。必要に応じて、または単に実行するだけで、イベントハンドラーの複雑さが解消され、アプリケーションの多くのイベントに同じパターンを使用することになります。

static class ControlExtensions
{
  public static void InvokeOrExecute(this Control control, Action action)
  {
     if (control.InvokeRequired)
     {
        control.Invoke(action);
     }
     else
     {
        action();
     }
  }
}

次に、クロススレッドになる可能性のある各イベントで:

Action setProgress = delegate()
     {
        pbTotalProgress.Value = progress;
        labe1.Text = "SomeText";
     };
this.InvokeOrExecute(setProgress);
于 2012-11-04T04:11:49.873 に答える
1

これは同じコードブロックなので、Action変数に設定してInvoke/executeすることができます。次のようなものを試してください:

Action setProgress = delegate() {
    pbTotalProgress.Value = progress;
    labe1.Text = "SomeText";
};
if (this.InvokeRequired) {
    this.Invoke(setProgress);
} else {
    setProgress();
}

正確なコードは実際には最適化する必要はありません。発生しているのは、ブールフラグに対して条件付きチェックを実行していることだけですthis.InvokeRequired。どちらかといえば、私の答えは、アクションコードを複製するのではなく、一度だけ書く能力を提供します。

于 2012-11-04T04:11:44.447 に答える