繁体   English   中英

何时注册将Form.Invoke调用到事件的方法?

[英]When to register a method that will call Form.Invoke to an event?

我在Windows窗体应用程序中得到以下异常

System.InvalidOperationException:在创建窗口句柄之前,无法在控件上调用Invoke或BeginInvoke。

发生异常的方法调用this.Invoke(System.Windows.Forms.Form.Invoke)。 此方法注册到构造函数中的另一个类的事件,这似乎导致竞争条件和此异常。

public Form1()
{
    InitializeComponent();
    SomeOtherClass.Instance.MyEvent += new SomeDelegate(MyMethod);
}

private void MyMethod()
{
    this.Invoke((MethodInvoker)delegate
    {
        // ... some code ...
    }
}

表单生命周期的哪个阶段是Handle创建的? 在哪种形式的事件中将方法注册到外国事件是安全的?

我想如果您在OnShow事件中注册该方法,您应该是安全的。

按照bitxwise的建议,在注册处理程序之前调用InitializeComponent()

当表单被处理时你会遇到同样的问题,因此处理器处于ungs。

你可以在你的处理程序中做if(this.IsHandleCreated)这样的事情是安全的。

好的,我现在改为:

public Form1(){
    InitializeComponent();
}
protected override void OnHandleCreated(EventArgs e)
{
    base.OnHandleCreated(e);
    SomeOtherClass.Instance.MyEvent += new SomeDelegate(MyMethod);
}
private void MyMethod()
{
    this.Invoke((MethodInvoker)delegate
    {
        // ... some code ...
    }
}

替代版本将是

public Form1(){
    InitializeComponent();
    SomeOtherClass.Instance.MyEvent += new SomeDelegate(MyMethod);
}
private void MyMethod()
{
    if (this.IsHandleCreated)
    {
        this.Invoke((MethodInvoker)delegate
        {
            // ... some code ...
        }
    }
}

IsHandleCreated已经IsHandleCreated之路。 以下片段讲述了如何做到这一点。

public class TestEvent : Form
{

    protected override void OnHandleCreated(EventArgs e)
    {
        base.OnHandleCreated(e);
        MyMethod();

    }
    private void MyMethod()
    {

        this.Invoke(new Action(() =>
                                   {
                                      //Here goes your code.
                                   }));
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM