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. 鉴于此方法在后台线程中运行,在方法中InvalidateClose我应该检查InvokeRequired属性吗?
  2. 鉴于此方法在后台线程中运行,该InvokeRequired属性将始终返回false,所以我应该避免检查它吗?

对于#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);
}
于 2011-05-02T14:54:06.313 回答