.NET对任意控件的调用

.NET对任意控件的调用,.net,controls,.net,Controls,我有一个方法,它接收.NET控件并对其调用invoke,如下所示: Form.Invoke(Target); 但是,我多次在调用此方法时遇到一个问题,由于时间或其他原因,窗体上的窗体句柄不存在,导致在创建窗口句柄之前无法对控件调用调用或BeginInvoke错误。在沮丧中,我开玩笑地将代码更改为: MainForm.Invoke(Target); 其中MainForm是应用程序的主窗口(主窗体的窗体句柄在启动时创建,并在应用程序的整个生命周期内保持活动状态)。我运行了所有的测试并手动测试了应

我有一个方法,它接收.NET控件并对其调用invoke,如下所示:

Form.Invoke(Target);
但是,我多次在调用此方法时遇到一个问题,由于时间或其他原因,窗体上的窗体句柄不存在,导致在创建窗口句柄之前无法对控件调用
调用或BeginInvoke
错误。在沮丧中,我开玩笑地将代码更改为:

MainForm.Invoke(Target);
其中
MainForm
是应用程序的主窗口(主窗体的窗体句柄在启动时创建,并在应用程序的整个生命周期内保持活动状态)。我运行了所有的测试并手动测试了应用程序,尽管这在任何地方都被使用,但一切似乎都很好

所以我的问题是,调用特定控件的确切含义是什么?总是对一个您知道将处于活动状态的控件调用有什么不利之处吗?如果没有,为什么.NET首先让您对控件进行调用(而不仅仅是创建一个静态的
GuiThread.InvokeOnGuiThread(Blah);
)?

关于SO的这个问题:将为您提供一个可能的答案和讨论,并回答您可能遇到的问题

至于
GuiThread.InvokeOnGuiThread(Blah)解释它将如何与具有消息泵和管理窗口控件的多个线程一起工作(
WindowsFormsSynchronizationContext
通过在GUI线程上创建并附加到当前执行的线程来解决此问题)。

Most“直到创建了窗口句柄”通过将除控件创建之外的所有初始化从表单构造函数移动到
form.Load
事件,可以轻松修复错误。