不能在控件上调用BeginInvoke
本文关键字:调用 BeginInvoke 控件 不能 | 更新日期: 2023-09-27 17:50:04
从非UI线程调用下面这行代码会导致错误:
系统。在System.Windows.Forms.Control上创建窗口句柄之前,不能在控件上调用Invoke或BeginInvoke。MarshaledInvoke(控制调用者,委托方法,对象[]参数,布尔同步)
this.formWaitingForm
.BeginInvoke((MethodInvoker)(() =>
this.formWaitingForm.ShowDialog(this)));
是的,这不起作用。您不能调用尚未创建的控件。表单也必须在主线程上创建。你是否打算转而调用this
?
this.BeginInvoke(()=>{
Form f=new MywaitForm();
f.Showdialog(this);
});
如果我理解正确的话,这应该可以解决问题。
说明:BeginInvoke
或Invoke
向给定窗口的消息循环(即调用左侧的消息循环)发布一个特殊消息。此消息将由创建该窗口并正在处理用户交互的线程处理。一旦线程看到这样一个特殊的消息,代码将在其上下文中执行。因此,Invoke的目标对象需要是一个活动窗口。
表示Control
s句柄尚未创建。参见ishandleccreated属性
这可能有多种原因。你可以通过调用CreateControl方法来强制创建句柄。
CreateControl方法强制为控件及其子控件创建句柄。当您需要立即使用句柄来操作控件或其子控件时,使用此方法;简单地调用控件的构造函数并不能创建句柄。
如果控件的Visible属性为false,则CreateControl不创建控件句柄。无论控件的可见性如何,您都可以调用CreateHandle方法或访问Handle属性来创建控件的句柄,但是在这种情况下,不会为控件的子控件创建窗口句柄。
因此,您可能需要尝试抓取Control.Handle
值来强制创建句柄,这取决于您的情况。