winform 调用 this.invoke 出错 无法访问已释放的对象

xyz378704 2009-03-05 08:14:08
{"无法访问已释放的对象。\r\n对象名:“mainForm”。"} System.Exception {System.ObjectDisposedException}
出现该异常是在关闭窗口的时候,又再次调用了this.invoke方法.
请问如何在关闭窗口时候把invoke的线程给干掉或者如何避免.
...全文
2798 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuzhenpolestar 2012-02-17
  • 打赏
  • 举报
回复
我是在窗体关闭事件里加了个thread.abort();
liuzhenpolestar 2012-02-17
  • 打赏
  • 举报
回复
isdisposed不行!![Quote=引用 11 楼 darkkeeper 的回复:]

不是这样的,因为MainForm是调用Dispose释放的,所以查null没有用,把它传递给托管也不行,因为这里并不是垃圾回收机制释放的,很简单,用IsDisposed检查一下就可以了
[/Quote]d
liuzhenpolestar 2012-02-17
  • 打赏
  • 举报
回复
这样写有什么道理吗?

[Quote=引用 10 楼 battlerxange 的回复:]
如果你的线程方法放在了类中,那么调用委托必须要这么做
C# code

FORM1.Invoke(new MethodInvoke(myMethod));


但是这样做就会出现LZ所说的异常,所以必须传递一个参数,在调用线程或者在这之前,将FORM1传递进来!
一个例子:
C# code

//FORM:
private void Form1_Load(object ……
[/Quote]
darkkeeper 2010-06-13
  • 打赏
  • 举报
回复
不是这样的,因为MainForm是调用Dispose释放的,所以查null没有用,把它传递给托管也不行,因为这里并不是垃圾回收机制释放的,很简单,用IsDisposed检查一下就可以了
BATTLERxANGE 2009-08-22
  • 打赏
  • 举报
回复
如果你的线程方法放在了类中,那么调用委托必须要这么做

FORM1.Invoke(new MethodInvoke(myMethod));

但是这样做就会出现LZ所说的异常,所以必须传递一个参数,在调用线程或者在这之前,将FORM1传递进来!
一个例子:

//FORM:
private void Form1_Load(object sender, EventArgs e)
{
Class1 c1 = new Class1();
Thread xc = new Thread(c1.xiancheng);
xc.Start(this);//启动线程的时候,要在这里将FORM传递过去
}


//CLASS1:
namespace WindowsApplication1
{
delegate void MethodInvoke(Form1 frm1);//申明委托,带一个FORM1参数
class Class1
{
public void xiancheng(object frm)
{
Form1 frm1 = (Form1)frm;//在这里要将OBJECT转为FORM1
frm1.Invoke(new MethodInvoke(weituo),frm1 );//调用委托,并且传递FRM1
}
public void weituo(Form1 frm1)
{
frm1.Text = "123";//修改FORM1窗体的标题
}
}
}
足球中国 2009-08-22
  • 打赏
  • 举报
回复
判断一下是否null就可以了。虽然调用invoke所在的过程是通过子线程的,但是执行invoke还是还给主线程来做得。
ttianqq 2009-08-22
  • 打赏
  • 举报
回复
也可以添加一个BOOL b变量 在关闭窗口事件中置为true

然后这样
if(!b)
this.Invoke(....);
jsoner 2009-08-22
  • 打赏
  • 举报
回复
暂时使用try来捕获异常屏蔽这个错误提示吧。
try
{
this.Invoke(new MethodInvoke(myMethod));
}
catch
{
}

這個對.
每天10分可用分..HOHO
比尔盖熊 2009-08-22
  • 打赏
  • 举报
回复
暂时使用try来捕获异常屏蔽这个错误提示吧。
try
{
this.Invoke(new MethodInvoke(myMethod));
}
catch
{
}
jinjazz 2009-03-05
  • 打赏
  • 举报
回复
判断一下是否null就可以了。虽然调用invoke所在的过程是通过子线程的,但是执行invoke还是还给主线程来做得。
ginni215 2009-03-05
  • 打赏
  • 举报
回复
以前我通过其他的控件来关闭窗口的时候也出现过这个问题,
创建已释放资源的对象异常
qinhl99 2009-03-05
  • 打赏
  • 举报
回复
你在试图操作已释放的对象(如已关闭的流或注册表项),所以会引发 ObjectDisposedException 异常,在尝试使用资源前,请确保该资源还未释放
七伤拳 2009-03-05
  • 打赏
  • 举报
回复
是谁调用的this.invoke方法?为什么要在关闭窗口的时候调用这个方法?
把相关部份的代码段贴出来吧
lateknow 2009-03-05
  • 打赏
  • 举报
回复
if判断一下.

110,574

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧