我已经创建了一个简单的表单,它创建了两个类A和B。类A启动一个每秒触发和事件的线程。类B订阅此事件并更新标签。代码看起来像这样:
A类。
public delegate void MyEventHandler(string text);
public event MyEventHandler MyEvent;
...
int i = 0;
if(MyEvent != null)
MyEvent(i.ToString());
i++;B类。
public delegate void MyEventHandler(string text);
void IncomingEvent(string text)
{
if(InvokeRequired)
Invoke(new MyEventHandler(IncomingEvent), text);
else
label.Text = text;
}在我尝试关闭窗体之前,这段代码似乎就像预期的那样工作。当关闭Invoke行时,抛出一个InvalidOperationException。我想这是因为我的表单在我的最后一个事件发生之前被处理掉了。显然,我可以捕获这个异常并将其隐藏起来,就像它从未发生过一样,但我很好奇处理这个问题的正确方法是什么。提前感谢你的帮助。
发布于 2011-08-03 02:32:09
如果确实已释放,请尝试IsDisposed属性。(窗体扩展控件)
public delegate void MyEventHandler(string text);
void IncomingEvent(string text)
{
if(IsDisposed)
return;
if(InvokeRequired)
Invoke(new MyEventHandler(IncomingEvent), text);
else
label.Text = text;
}发布于 2011-08-03 02:32:11
当你检查InvokeRequired时,只需检查表单是否为IsDisposed,一切都应该很好:
public delegate void MyEventHandler(string text);
void IncomingEvent(string text)
{
if(!IsDisposed && InvokeRequired)
Invoke(new MyEventHandler(IncomingEvent), text);
else
label.Text = text;
}https://stackoverflow.com/questions/6916760
复制相似问题