[英]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.