调用必填疑问

发布于 2024-11-04 18:21:12 字数 428 浏览 3 评论 0原文

将从非 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();
        }
      }

The following method will be invoked from a non UI thread. Should I check InvokeRequired, for calling these items in the method?

a. 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();
        }
      }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

如梦亦如幻 2024-11-11 18:21:12

Control.Invoke 和 Control.BeginInvoke 可以安全地从 UI 线程和非 UI 线程调用,因此,如果您已经知道自己位于非 UI 线程上,则跳过检查并仅调用 Invoke/BeginInvoke 没有什么坏处(IMO) 。

例子:

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

Control.Invoke and Control.BeginInvoke are safe to call from the UI thread and non-UI threads, so if you already know you are on a non-UI thread there is no harm (IMO) skipping the check and just calling Invoke/BeginInvoke.

Example:

anyControl.Invoke((MethodInvoker)delegate{
    // anything to run on UI thread here
});
小嗲 2024-11-11 18:21:12

听起来您可能会问以下问题之一

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

对于#1,答案是否定的。 CloseInvalidate 方法没有责任检查 InvokeRequired 属性。在调用它们之前,InvokeRequired 属性为 false,这是其契约的隐含部分。

对于#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);
}

It sounds like you could be asking one of the following

  1. Given that this method runs in a background thread, within the methods Invalidate and Close should I be checking the InvokeRequired property?
  2. Given that this method runs in a background thread the InvokeRequired property will always return false so should I just avoid checking it?

For #1 the answer is no. The methods Close and Invalidate don't have a responsibility to check the InvokeRequired property. It is an implicit part of their contract that the InvokeRequired property be false before they are called.

For #2, yes if it's always called on a background thread I would skip the check and just go straight to the Invoke methods.

In either case I would rewrite the method as follows.

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);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文