下面的方法将从非UI线程调用。我是否应该检查InvokeRequired,以便在方法中调用这些项?
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();
}
}发布于 2011-05-02 22:47:37
从UI线程和非UI线程调用Control.Invoke和Control.BeginInvoke是安全的,所以如果您已经知道自己在非UI线程上,那么跳过检查,只调用Invoke/BeginInvoke没有什么坏处。
示例:
anyControl.Invoke((MethodInvoker)delegate{
// anything to run on UI thread here
});发布于 2011-05-02 22:54:06
听起来您可能会问以下问题之一
如果此方法在后台线程中运行,则在Invalidate和Close方法中,是否应检查此方法在后台线程中运行的InvokeRequired property?
false,因此我是否应该避免选中它?对于#1,答案是否定的。方法Close和Invalidate不负责检查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);
}https://stackoverflow.com/questions/5858557
复制相似问题