[AsyncHandle]什么引发了ObjectDisposedException?

[AsyncHandle]什么引发了ObjectDisposedException?


Version


Date


Creator


Description


1.0.0.1


2006-9-19


郑昀


草稿

 

继续阅读之前,我们假设您熟悉以下知识:

n         IDisposable接口释放dotNET资源

如果不熟悉这些知识点,可以看本文最后资源列表中的文章。

本文讨论了出现不可捕获的ObjectDisposedException异常崩溃,寻找可能的原因,并试图解决。

[现象]

关键词:      ObjectDisposedException

表象:          我的dotNET C#服务偶尔会彻底崩溃,时机没有规律可循,崩溃时在Windows事件日志中有来自于“.NET Runtime 2.0 Error Reporting”的报告,描述的错误也颇让人费思量。

错误描述:         

事件类型:     错误

事件来源:     .NET Runtime 2.0 Error Reporting

事件种类:     

事件 ID:       5000

描述:

EventType clr20r3, P1 juiceextractor.exe, P2 1.0.0.0, P3 450d5160, P4 mscorlib, P5 2.0.0.0, P6 4333ab80, P7 10ed, P8 0, P9 system.objectdisposedexception, P10 NIL.

 

通过ObjectDisposedException对我们的提醒,可以了解到这是因为前面已经使用了一个disposed对象。在一个使用过disposed对象上调用其他方法时是会引发致命异常的,服务也不知道该在哪里捕获这个异常,似乎也不可捕获。但是,问题是,是谁引发的?

 

引申:          看到微软的一个对dotnet framework的servicepack公告中提到:当一个异步Web 请求在接收到响应之前如果被中止,则会引发ObjectDisposedException。

 

唯一和异步请求有点关系的是,本服务向一个socket服务器发送请求,并等候一段一段地循环接收服务器的大量数据反馈。这中间,使用了C#的异步方法BeginReceive来告知socket如何接收数据。

这个逻辑的代码如下:


C# code


/// <summary>

/// 调用异步方法BeginReceive来告知socket如何接收数据

/// </summary>

IAsyncResult ar =

_socket.BeginReceive(_recvBuffer.Buffer, 0, _recvBuffer.Buffer.Length,

                SocketFlags.None, _recvCallback, _socket);

 

// 设定一个期限,10分钟内如果还没有结果返回,

// 我们可以认为必须关掉当前socket连接了,不要再等了!

ar.AsyncWaitHandle.WaitOne(new TimeSpan(0, 10, 0), true);

ar.AsyncWaitHandle.Close();

….

public void RecvCallback(IAsyncResult result)

{…

 

也就是利用回调函数 “_recvCallback”,每次有数据的话,都直接调用它。但是,规定了如果10分钟内都没有完整结果返回,那么这个异步等候句柄将被关闭。

 

很简单的想法。

但是如果数据量大的话,socket服务器计算的过程非常漫长,导致返回数据的过程超过了10分钟,会发生什么事情呢?

[回答前面的问题]

这个时候,“ar.AsyncWaitHandle.Close();”是不是就导致了ObjectDisposedException呢?

假设如此的话。

第一,那我们需要调用AsyncWaitHandle.Close()这句话吗?

The Thread Pool and Asynchronous Methods中说道:“Note the call toar.AsyncWaitHandle.Close(). This prevents the WaitHandle leaking until garbage collection. The leak wouldn't cause any problems in most cases (unlike, for instance, file handles leaking), but in situations where FireAndForget would be called many, many times in quick succession, you could end up with a vast number of handles until the garbage collector started finalizing them. (This is also a bad thing in terms of performance - you shouldn't leave things to be finalised when it can be avoided.)”

那么,也许我们可以不调用它,来规避ObjectDisposedException异常崩溃?

 

第二,把ar.AsyncWaitHandle.WaitOne(new TimeSpan(0, 10, 0), true);等候的时间延长?比如说延长到40分钟。这样也可以避免ObjectDisposedException。

[改变接收模式]

第三,对于这种长时间执行的socket服务器,可以不用在一个端口上干等,可以发送请求用一个端口,接收数据反馈用另外一个socket端口号。

以前没有考虑到计算时间如此之长,所以才做成了socket异步接收模式。后来算法作了改变,有时候十分钟的等候都不够了。

 [参考资料]

用IDisposable接口释放.NET资源

The Thread Pool and Asynchronous Methods

时间: 2024-08-04 08:09:07

[AsyncHandle]什么引发了ObjectDisposedException?的相关文章

文件 提取 字-文件按字读取存储引发的一点问题

问题描述 文件按字读取存储引发的一点问题 问题比较复杂: 1.我需要将二进制文件提取出来,加密后存入另一文件 2.由于原始文件按字节(fgetc)提取加密后会变成很大的数(>255),因此不能用fputc来存加密后的数据,这就不可避免的用到putwc.但是putwc会使加密文件变大(由char变成了wchar),而我又想保持源文件大小. 3.我想到了按字提取fgetwc.按字存储fputwc,但是按字提取不能很好解决文件结尾的判定,如果源文件只有"abc"三个字符,那么按字提取只

spring-maven 打jar包,引发程序运行时候报错

问题描述 maven 打jar包,引发程序运行时候报错 java项目A,用maven 打完jar包之后,放入项目B中使用,运行报如下错误java.lang.NoSuchFieldError: ALIAS_TO_ENTITY_MAP: 用MyEclipse 自带的export jar打包,却没有这个问题,很是郁闷,求解... 报错代码:query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); 解决方案 请检查确认项目 B 里的 A.

String copy on write 引发的线程不安全

   一个string对象的读操作是线程安全的么?答案是否定的.读取一个string在某些情况下是线程不安全的.这是为什么呢?原因就是string在优化存储空间时采用的策略cow. 什么是cow      Cow 是copy on write的缩写.String 为了减少内存拷贝,当两个string对象的内容相同时,他们指向同一块内存空间,并通过引用计数来表示有多少对象引用了这块内存.当其中某个string对象的内容发生改变时,string会先重新分配一块空间,把原来的内容拷贝到新空间,原来的空

股市热潮引发电脑安全隐患 股民安全八大注意

股市热潮引发电脑安全隐患 近日,由于股票市场的持续火爆,使得越来越多的新股民进入股市.据有关部门统计,目前每13个中国人就有1个炒股.每天A股开户数新增30万户,我国已进入"全民皆股"时代.而网上炒股以其"交易方便快捷.信息量大,紧跟行情.辅助分析系统强大"等特点成为股民炒股的首选方式.但据专家介绍,由于大多数股民缺乏基本的防护意识和措施,使网上炒股面临极大的安全风险. "自5月8日开市以来,因为电脑中毒而向瑞星求助的股民已有数百人,股民已经成为电脑病毒受

GridViewRow可以任意位置单击引发事件的方法

GridView 是 ASP.NET 2.0 中应用最为广泛一个控件,几乎所有的数据操作都需要它,正如我们平常所应用的,可以编辑.删除.选择等等,但如果客户有需要通过单击行而引发超链接或者进入行编辑状态时,我们该如何实现,这里介绍了一种方法来实现此功能.它将允许你通过点击行的任何一个位置而引发你所需要的事件. 首先为 GridView  填充数据  private void BindData()    {        SqlConnection myConnection = new SqlCo

CNNIC推广1元注册域名将引发无限商机

推广|注册域名 关于CNNIC以史无前例的超低价格推出的"CN域名1元注册体验活动",最近已经炒得沸沸扬扬,相信大家也有所耳闻,如果是还不清楚事情来龙去脉的朋友,不妨看看下面的简述: --3月7日,我国域名注册管理机构中国互联网络信息中心(CNNIC)在北京召开新闻发布会,正式启动国家域名腾飞行动,并宣布从即日起至5月31日,新注册CN域名第一年将享受1元钱的注册价格.据了解,本次"CN域名一元体验活动暨国家域名腾飞行动"得到信息产业部.国务院信息化工作办公室.国务

引发自定义控件LoadPostData方法的必要条件!

控件|条件 自定义控件要引发LoadPostData方法,需要包含一个ID为this.UniqueID的控件 可在控件组中加入一个Hidden控件! writer.Write("<input type='hidden' name='" + me.UniqueID + "'>") 或者干脆更简单的做法,把submit的name属性设置为me.UniqueID Imports System.ComponentModelImports System.Web.U

一次用ASP页面漏洞引发的渗透攻击

攻击|页面 最近几天,网络上好像总是不太平,自从WebDAV漏洞的溢出工具发布之后,网上潜在的"肉鸡"好像慢慢多了起来.虽然补丁也已经发布多日,但是还是有人没有放在心上--但是我今天要讲的并不是WebDAV漏洞的溢出攻击,而是一次用asp叶面漏洞引发的渗透攻击.前天晚上,一个多日不见的朋友,忽然在网上Q我(因为他是广东人,所以我以为他住院了,呵呵),聊了一会突然给了我一个地只要我看看,问我能不能得到发布新闻的权限--老套路,ping一下域名得到IP地址,使用SuperScan进行端口扫

由百度此次疯狂“屠杀”引发的思考

自从6月22号至今,百度就没有安宁过.也许你与我有同样的感受,8月22日下午,百度官方站长论坛管理员公布,新的算法预计于23日更新.果不出所料,不到几个钟,该条帖子点击率超过5000.翌日,相信很多站长朋友并没有感觉到自己网站有变化,可能就因此松懈了.意料之外的是25日也就是周六,很明显的感觉到网站流量掉了很多,这时候笔者才觉得不妙,肯定有事情发生.于是习惯性的使用站长工具检测一下,想不到网站权重由2变为1.   今日上班检查网站情况,品牌词"东莞现代妇科医院"排名也掉了,其他关键词东