问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

求助Cannot access a disposed object

发布网友 发布时间:2022-05-04 09:56

我来回答

2个回答

热心网友 时间:2022-05-04 11:25

  带有UI的C#程序在初始化界面或者由用户触发某一UI更新的时候常常会遇到这样的JIT异常:

  System.ObjectDisposedException: Cannot access a disposed object.

  Object name: 'XXXX'.

  从字面上理解,就是无法得到一个已经被终止的对象。那么在什么情况下这样的事情会发生呢?

  看一段代码就能够理解了。

  

Code
public AuthenticationForm()

{
// Required for Windows Form Designer support

  InitializeComponent();

  // TODO: Add any constructor code after InitializeComponent
call

  this.action = FormAction.View;

  AppButtons.AppParent = this;

  this.EDITCTLS = new Control[] {RoleDGrid, RegionDGrid,
UserNameTBox, CheckAllButton, ClearAllButton, ActiveCkBox, RoleCheckAllButton,
RoleClearAllButton};

  this.Initialization();

BeginAuth("GetUser", new object[]{AddUserButton});

  }

  Main方法执行了MainForm的初始化,完成必要组件实例化和数据导入,开始等待用户输入。

  Ok,用户这时候点击了一个登录菜单,以上form
constructor代码经事件触发,开始执行,啪啪啪完成新form的初始化,最后一步看到BeginAuth方法,它要完成对用户的验证,如果验证通过,登录Form要显示,如果验证失败,主进程要返回错误信息,终止此form的所有资源。

  但请注意,这个BeginAuth可不能随便写写。看看这段BeginAuth的实现吧:

  

  

  DataManager.SendAsyncWSRequest(this, this.displayDelegate, spName,         DataManager.XMLDOC.InnerXml,
hash);
  DataManager是数据底层传输处理的接口,它是通用的。DataManager要发出WebService的数据请求,然后获得回答(response),再通过this传入的CallingForm实例调用Form的另一个方法EndAuth。

  callingForm.EndAuth(resultXML, spName, hash, new ResponseArgs(false,
errorNode.InnerXml,
AsyncFailType.WSCaught));
EndAuth要解析WebService的response,判断是否验证通过,和相应Form的资源如何响应。以下是简单的EndAuth实现:

  

  Code
if(resp.Success == false)
{

MessageBox.Show(re.Msg, spName + ": WebService call fails");

  base.EndAuth(re.Msg, spName, hash, re);

  this.Close();

  return;

  }

  else

  UpdateDisplay();

  Form在失败验证之后会被马上close掉,换句话说,this.Close()会终止form之前初始化的所有组件,GC不知不觉开始回收内存。。。。

  本文的主题在这个return之后发生了。return一完成,它退到哪儿了?对,之前form
constructor的BeginAuth之后,也就是说,form还没有“出生”就已经被“堕”了。但被“堕”不等于什么也没有(null),毕竟“尸骨”犹在。MainForm在得知sub-form
constructor返回以后就会执行类似显示form的方法Show()。要秀就要拿到form句柄,但老子(mainform)拿到的却是一个夭折的孩子。。。当然怎么show也于事无补了。悲惨的Cannot
access a disposed object异常就这样发生了。由于是从Mainform触发,它会直接影响主进程,导致程序崩溃。

  知道了来龙去脉,那么怎样避免呢?很简单,

  1. 不要在constroctor没有做完之前就任意终止资源(原则性)

拿示例来说的话,就是不要将BeginAuth方法置于构造方法内,置于Form_load()方法中不失为一良策。

  2. 在拿来show之前要判断是否为空或已被终止(辅助性)

  if (subForm!= null && !subForm.IsDisposed)

  subForm.Show();
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
ups快递客服电话24小时 贷款记录在征信保留几年? 安徽徽商城有限公司公司简介 安徽省徽商集团新能源股份有限公司基本情况 安徽省徽商集团有限公司经营理念 2019哈尔滨煤气费怎么有税? 快手删除的作品如何恢复 体育理念体育理念 有关体育的格言和理念 什么是体育理念 JBIOSISL注册过商标吗?还有哪些分类可以注册? ISHILAI ISL注册过商标吗?还有哪些分类可以注册? 新西兰护照去加拿大要签证吗? ILISI ALICE ISL注册过商标吗?还有哪些分类可以注册? 24-28届奥运会金银铜情况 liunx系统 锁定 ISL6227CA是什么作用 陈奕迅专辑《认了吧》正版大概多少钱,懂得来 求陈亦迅 认了吧 歌词 用康明斯发动机的车有那些车型!! 陈奕迅认了吧专辑里哪几首歌是WHAT‘S GOING ON里的歌的国语版 大家觉得陈奕迅《认了吧》专辑怎么样?你们喜欢哪首歌曲? 陈奕迅{认了吧}的歌词谁知道? 认了吧的专辑曲目 滚筒洗衣机出现这样是什么原因? 跪求 陈奕迅-2007 认了吧[香港]音乐专辑百度云分享 陈奕迅有那几张专辑?发行时间?具体有哪几首歌曲 谁有陈奕迅《认了吧》无损音乐专辑百度云下载 求陈奕迅所有专辑名称(带年份) 认了吧的专辑鉴赏 大家对于异性网友有什么看法 现在网上已经不能买《圣经》了吗? 异性网友见面可以拥抱吗? 异性网友见面意味着什么? 你认为和异性网友保持什么样的关系最好? 请问你还有没有经书?我不知道到哪里去求经书。要什么条件。 第一次和异性网友见面是什么感觉? 用京东e卡买的东西可以开发票吗 和异性网友保持什么样的关系最好? 异性男网友可以见面吗? 异性网友头天还聊的很好,第二天突然不聊了,怎么回事? word 设置双页面 格式 异性网友发展到见面,你觉得会不会走到一起? 异性网友聊天会有感情投入吗? 异性网友见面大多见面做些什么? 用京东e卡买东西有发票吗 聊得很好的异性网友,慢慢的就不聊天了,很正常吗 请问印度教的经典-《吠陀经》,哪里有卖? 和异性网友见面,该注意什么 用京东e卡买的家电可以开增值税发票吗