InvokeRequired doubt

喜夏-厌秋 提交于 2019-12-11 10:49:32

问题


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

回答1:


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
});



回答2:


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);
}


来源:https://stackoverflow.com/questions/5858557/invokerequired-doubt

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!