簡體   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