1

次のメソッドは、非 UI スレッドから呼び出されます。メソッドでこれらのアイテムを呼び出すために、InvokeRequired を確認する必要がありますか?

を。this._moduleStatusGrid.Invalidate()
b. this.Close()

private void CheckIfAllModulesInitComplete()
      {
        this._moduleStatusGrid.Invalidate();
        if (this._moduleDataList.Count(moduleData => !moduleData.IsInitOver) == 0)
        {
          this._footprint.DeActivate();
          this.Close();
        }
      }
4

2 に答える 2

3

Control.Invoke と Control.BeginInvoke は、UI スレッドと非 UI スレッドから安全に呼び出すことができるため、非 UI スレッドを使用していることが既にわかっている場合は、チェックをスキップして Invoke/BeginInvoke を呼び出すだけで問題はありません (IMO)。 .

例:

anyControl.Invoke((MethodInvoker)delegate{
    // anything to run on UI thread here
});
于 2011-05-02T14:47:36.520 に答える
0

次のいずれかを尋ねているようです

  1. このメソッドがバックグラウンドスレッドで、メソッド内で実行されているInvalidateとすると、プロパティCloseをチェックする必要がありますか?InvokeRequired
  2. このメソッドがバックグラウンドスレッドで実行される場合、InvokeRequiredプロパティは常に返さfalseれるので、チェックを避ける必要がありますか?

#1の場合、答えはノーです。メソッドCloseとプロパティInvalidateをチェックする責任はありません。それらが呼び出される前にプロパティがfalseであるという InvokeRequiredことは、それらのコントラクトの暗黙の部分です。InvokeRequired

#2の場合、はい、常にバックグラウンドスレッドで呼び出される場合は、チェックをスキップして、メソッドに直接進みInvokeます。

どちらの場合も、メソッドを次のように書き直します。

private void CheckIfAllModulesInitComplete()
{
  MethodInvoker del = delegate {
    this._moduleStatusGrid.Invalidate();
    if (this._moduleDataList.Count(moduleData => !moduleData.IsInitOver) == 0)
    {
      this._footprint.DeActivate();
      this.Close();
    }
  };
  this.Invoke(del, null);
}
于 2011-05-02T14:54:06.313 に答える