首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >关闭我的窗体时出现c#无效操作异常

关闭我的窗体时出现c#无效操作异常
EN

Stack Overflow用户
提问于 2011-08-03 02:27:00
回答 2查看 2.1K关注 0票数 1

我已经创建了一个简单的表单,它创建了两个类A和B。类A启动一个每秒触发和事件的线程。类B订阅此事件并更新标签。代码看起来像这样:

A类。

代码语言:javascript
运行
复制
public delegate void MyEventHandler(string text);
public event MyEventHandler MyEvent;
...
int i = 0;
if(MyEvent != null)
  MyEvent(i.ToString());
i++;

B类。

代码语言:javascript
运行
复制
public delegate void MyEventHandler(string text);
void IncomingEvent(string text)
{
  if(InvokeRequired)
    Invoke(new MyEventHandler(IncomingEvent), text);
  else
    label.Text = text;
}

在我尝试关闭窗体之前,这段代码似乎就像预期的那样工作。当关闭Invoke行时,抛出一个InvalidOperationException。我想这是因为我的表单在我的最后一个事件发生之前被处理掉了。显然,我可以捕获这个异常并将其隐藏起来,就像它从未发生过一样,但我很好奇处理这个问题的正确方法是什么。提前感谢你的帮助。

EN

回答 2

Stack Overflow用户

发布于 2011-08-03 02:32:09

如果确实已释放,请尝试IsDisposed属性。(窗体扩展控件)

代码语言:javascript
运行
复制
public delegate void MyEventHandler(string text);
void IncomingEvent(string text)
{
  if(IsDisposed)
    return;
  if(InvokeRequired)
    Invoke(new MyEventHandler(IncomingEvent), text);
  else
    label.Text = text;
}
票数 0
EN

Stack Overflow用户

发布于 2011-08-03 02:32:11

当你检查InvokeRequired时,只需检查表单是否为IsDisposed,一切都应该很好:

代码语言:javascript
运行
复制
public delegate void MyEventHandler(string text);
void IncomingEvent(string text)
{
   if(!IsDisposed && InvokeRequired)
       Invoke(new MyEventHandler(IncomingEvent), text);
   else
       label.Text = text;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6916760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档