不能在控件上调用BeginInvoke

本文关键字:调用 BeginInvoke 控件 不能 | 更新日期: 2023-09-27 17:50:04

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

系统。在System.Windows.Forms.Control上创建窗口句柄之前,不能在控件上调用Invoke或BeginInvoke。MarshaledInvoke(控制调用者,委托方法,对象[]参数,布尔同步)

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

不能在控件上调用BeginInvoke

是的,这不起作用。您不能调用尚未创建的控件。表单也必须在主线程上创建。你是否打算转而调用this ?

this.BeginInvoke(()=>{
    Form f=new MywaitForm();
    f.Showdialog(this);
});

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

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

表示Control s句柄尚未创建。参见ishandleccreated属性

这可能有多种原因。你可以通过调用CreateControl方法来强制创建句柄。

CreateControl方法强制为控件及其子控件创建句柄。当您需要立即使用句柄来操作控件或其子控件时,使用此方法;简单地调用控件的构造函数并不能创建句柄。

如果控件的Visible属性为false,则CreateControl不创建控件句柄。无论控件的可见性如何,您都可以调用CreateHandle方法或访问Handle属性来创建控件的句柄,但是在这种情况下,不会为控件的子控件创建窗口句柄。

因此,您可能需要尝试抓取Control.Handle值来强制创建句柄,这取决于您的情况。