从非UI线程调用时,下面的代码行会导致错误:
System.InvalidOperationException:在System.Windows.Forms.Control.MarshaledInvoke(控件调用者,委托方法,对象[] args,布尔同步)中创建窗口句柄之前,无法在控件上调用Invoke或BeginInvoke
this.formWaitingForm
.BeginInvoke((MethodInvoker)(() =>
this.formWaitingForm.ShowDialog(this)));
答案 0 :(得分:1)
这意味着尚未创建Control
句柄。请参阅IsHandleCreated属性。
这可能由于各种原因而发生。您可以通过调用CreateControl方法强制创建句柄。
这仍然可能无效:
CreateControl方法强制为控件及其子控件创建句柄。当您需要立即处理控件或其子控件时,可以使用此方法;简单地调用控件的构造函数不会创建句柄。
如果控件的Visible属性为false,CreateControl不会创建控件句柄。无论控件的可见性如何,您都可以调用CreateHandle方法或访问Handle属性来创建控件的句柄,但在这种情况下,不会为控件的子项创建窗口句柄。
因此,您可能需要尝试抓取Control.Handle
值以强制创建句柄,具体取决于您的情况。
答案 1 :(得分:1)
是的,这不起作用。您无法在尚未创建的控件上调用。表单也必须在主线程上创建。您是否打算在this
上调用?
this.BeginInvoke(()=>{
Form f=new MywaitForm();
f.Showdialog(this);
});
如果我能正确理解问题,这应该可以解决问题。
说明:BeginInvoke
或Invoke
将特殊消息发布到给定窗口的消息循环(即呼叫左侧的消息循环,即)。此消息将由创建该窗口并处理用户交互的线程处理。一旦线程看到这样一条特殊的消息,代码就会在其上下文中执行。因此,Invoke的目标对象需要是一个活动窗口。