InvokeRequired怀疑

时间:2011-05-02 14:43:28

标签: c# invokerequired

将从非UI线程调用以下方法。我应该检查InvokeRequired,以便在方法中调用这些项吗?

一个。 this._moduleStatusGrid.Invalidate()
湾this.Close()

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

2 个答案:

答案 0 :(得分:3)

Control.Invoke和Control.BeginInvoke可以安全地从UI线程和非UI线程调用,所以如果你已经知道你在非UI线程上,那么没有任何损害(IMO)跳过检查并且只是调用调用/ BeginInvoke的。

示例:

anyControl.Invoke((MethodInvoker)delegate{
    // anything to run on UI thread here
});

答案 1 :(得分:0)

听起来你可能会问以下其中一个

  1. 鉴于此方法在后台线程中运行,在方法InvalidateClose中我应该检查InvokeRequired属性吗?
  2. 鉴于此方法在后台线程中运行,InvokeRequired属性将始终返回false所以我应该避免检查它吗?
  3. 对于#1,答案是否定的。方法CloseInvalidate没有责任检查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);
    }