无法在控件上调用BeginInvoke

时间:2014-03-13 20:35:48

标签: c#

从非UI线程调用时,下面的代码行会导致错误:

  

System.InvalidOperationException:在System.Windows.Forms.Control.MarshaledInvoke(控件调用者,委托方法,对象[] args,布尔同步)中创建窗口句柄之前,无法在控件上调用Invoke或BeginInvoke

this.formWaitingForm
    .BeginInvoke((MethodInvoker)(() => 
                 this.formWaitingForm.ShowDialog(this)));

2 个答案:

答案 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);
});

如果我能正确理解问题,这应该可以解决问题。

说明:BeginInvokeInvoke将特殊消息发布到给定窗口的消息循环(即呼叫左侧的消息循环,即)。此消息将由创建该窗口并处理用户交互的线程处理。一旦线程看到这样一条特殊的消息,代码就会在其上下文中执行。因此,Invoke的目标对象需要是一个活动窗口。