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