在我的表单构造函数中,我调用:
InitializeComponent(); // boilerplate placed by VS, initializing controls
label1.BeginInvoke(new InvokeDelegate(RefreshLabelDelegate));
然而,我得到了可怕的异常消息:
“在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke”
AFAIK,都是同一个线程,为什么会出现异常?
在我的表单构造函数中,我调用:
InitializeComponent(); // boilerplate placed by VS, initializing controls
label1.BeginInvoke(new InvokeDelegate(RefreshLabelDelegate));
然而,我得到了可怕的异常消息:
“在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke”
AFAIK,都是同一个线程,为什么会出现异常?
label1.BeginInvoke
从构造函数移动到Form_Load
事件处理程序。
本机窗口句柄不会在构造函数中创建。直到稍后,在调用表单的 Show() 方法之后才会发生这种情况。以典型的 .NET 懒惰方式。Load 事件是创建后运行的第一个标准事件。还有 HandleCreated 事件,但它可能会运行不止一次。
您实际上不太可能在此处使用 BeginInvoke,它旨在用于让代码在创建 Label1 控件的线程上运行。构造函数应该已经在该线程上运行,如果不是,它是非常不健康的。如果打算绘制标签,则改用表单的 Shown 事件,在表单之后运行的第一个事件实际上对用户可见。
句柄还没有创建(你为什么说它是)。句柄不是在构造时创建的——它是延迟的。您可以通过访问控件的.Handle
属性来强制创建句柄来解决此问题。
以下内容可能会有所帮助:
不要调用 BeginInvoke,没有理由。在控件的构造函数中,您最好已经在适当的 UI 线程上。