将从非UI线程调用以下方法。我应该检查InvokeRequired,以便在方法中调用这些项吗?
一个。 this._moduleStatusGrid.Invalidate()
湾this.Close()
private void CheckIfAllModulesInitComplete()
{
this._moduleStatusGrid.Invalidate();
if (this._moduleDataList.Count(moduleData => !moduleData.IsInitOver) == 0)
{
this._footprint.DeActivate();
this.Close();
}
}
答案 0 :(得分:3)
Control.Invoke和Control.BeginInvoke可以安全地从UI线程和非UI线程调用,所以如果你已经知道你在非UI线程上,那么没有任何损害(IMO)跳过检查并且只是调用调用/ BeginInvoke的。
示例:
anyControl.Invoke((MethodInvoker)delegate{
// anything to run on UI thread here
});
答案 1 :(得分:0)
听起来你可能会问以下其中一个
Invalidate
和Close
中我应该检查InvokeRequired
属性吗?InvokeRequired
属性将始终返回false
所以我应该避免检查它吗? 对于#1,答案是否定的。方法Close
和Invalidate
没有责任检查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);
}