首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >InvokeRequired怀疑

InvokeRequired怀疑
EN

Stack Overflow用户
提问于 2011-05-02 22:43:28
回答 2查看 443关注 0票数 1

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

a. this._moduleStatusGrid.Invalidate()

b. this.Close()

代码语言:javascript
复制
private void CheckIfAllModulesInitComplete()
      {
        this._moduleStatusGrid.Invalidate();
        if (this._moduleDataList.Count(moduleData => !moduleData.IsInitOver) == 0)
        {
          this._footprint.DeActivate();
          this.Close();
        }
      }
EN

回答 2

Stack Overflow用户

发布于 2011-05-02 22:47:37

从UI线程和非UI线程调用Control.Invoke和Control.BeginInvoke是安全的,所以如果您已经知道自己在非UI线程上,那么跳过检查,只调用Invoke/BeginInvoke没有什么坏处。

示例:

代码语言:javascript
复制
anyControl.Invoke((MethodInvoker)delegate{
    // anything to run on UI thread here
});
票数 3
EN

Stack Overflow用户

发布于 2011-05-02 22:54:06

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

如果此方法在后台线程中运行,则在InvalidateClose方法中,是否应检查此方法在后台线程中运行的InvokeRequired property?

  • Given此属性将始终返回false,因此我是否应该避免选中它?

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

对于#2,是的,如果它总是在后台线程上调用,我会跳过检查,直接转到Invoke方法。

在任何一种情况下,我都会重写该方法,如下所示。

代码语言:javascript
复制
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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5858557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档