3

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

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

然而,我得到了可怕的异常消息:

“在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke”

AFAIK,都是同一个线程,为什么会出现异常?

4

4 回答 4

4

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

于 2012-10-26T15:46:56.883 回答
4

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

您实际上不太可能在此处使用 BeginInvoke,它旨在用于让代码在创建 Label1 控件的线程上运行。构造函数应该已经在该线程上运行,如果不是,它是非常不健康的。如果打算绘制标签,则改用表单的 Shown 事件,在表单之后运行的第一个事件实际上对用户可见。

于 2012-10-26T15:52:57.507 回答
2

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

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

于 2012-10-26T15:53:36.563 回答
0

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

于 2012-10-26T15:55:29.403 回答