BeginInvoke声称控件的窗口句柄尚未创建,即使我认为它是

时间:2012-10-26 15:43:13

标签: c# winforms begininvoke

在我的表单构造函数中,我调用:

InitializeComponent(); // boilerplate placed by VS, initializing controls
label1.BeginInvoke(new InvokeDelegate(RefreshLabelDelegate));

然而,我得到了一个可怕的例外消息:

  

在窗口之前,无法在控件上调用Invoke或BeginInvoke   句柄已创建“

AFAIK,它是完全相同的线程,为什么例外?

4 个答案:

答案 0 :(得分:4)

label1.BeginInvoke从构造函数移动到Form_Load事件处理程序。

答案 1 :(得分:4)

本机窗口句柄在构造函数中创建而不是。直到稍后,在调用窗体的Show()方法之后才会发生这种情况。在典型的.NET懒惰时尚。 Load事件是在创建后运行的第一个标准事件。还有HandleCreated事件,但它可能会运行多次。

在这里实际上不太可能需要使用BeginInvoke,它意味着用于在创建Label1控件的线程上运行代码。构造函数应该已经在该线程上运行,如果不是,那么它是非常不健康的。如果打算绘制标签,则使用Form的已显示事件,即在表单实际对用户可见之后运行的第一个事件。

答案 2 :(得分:2)

尚未创建句柄(为什么说它是)。手柄不是在构造时创建的 - 它是延迟的。您可以通过访问控件的.Handle属性来强制创建句柄来解决此问题。

以下内容可能会有所帮助:

答案 3 :(得分:0)

不要调用BeginInvoke,没有理由。在控件的构造函数中,最好已经在相应的UI线程上。