思想决定人生,态度改变一切
成功者找方法,失败者找借口! 做事先做人;安分做人,本分做事!
博客园
::
首页
::
新随笔
::
联系
::
订阅
::
管理
::
182 随笔 :: 0 文章 :: 23 评论 :: 1 Trackbacks
.NET 2.0 CER学习笔记 [转载]
CER是.NET 2.0 CLR方面的重要改进,旨在帮助那些对稳定性高度苛刻的程序对付.NET Framework的不稳定因素。因为普通的程序很少会用到,所以一直没有对这个特性加以足够重视。现在碰巧在翻译书籍的过程中用到,就一起来学习一下。
首先,需要提到异步异常的问题。异步异常就是指OutOfMemoryException、StackOverflowException和ThreadAbortException等系统异常。说他们“异步”是因为他们可以在线程代码执行到任何地方的时候发生。一般的异常,比如FileNotFoundException是由代码自己产生的,因此可以用Try语句正常捕捉和处理。而异步异常则是CLR产生的。而且,这些异常都预示着非常严重的错误,代码自己通常都会手足无措。比方说内存耗尽了,代码自己即使Catch了也无济于事,都不知道刚刚哪一步出的问题,也不知道该怎么继续执行。ThreadAbortException通常是由Thread.Abort方法引发,如果要Abort的线程正在进行很关键的人物,比如修改一个全局对象的状态,那么发生ThreadAbortException可能会让整个程序的状态受损,进而产生错误的行为。因此,需要有种机制告诉CLR,我们要进行的事情很关键,不容打断,这就是CER——Constrained Execution Region。
声明CER很简单,先调用System.Runtime.CompilerServices.RuntimeHelpers.PrepareConstrainedRegions()方法,再紧接一个Try...Catch...Finally块即可。注意,这个Try必须紧接着PrepareConstrainedRegions()方法,而且,
只有Catch和Finally块的内容成为CER
。如下所示
RuntimeHelpers.PrepareConstrainedRegions()
Try
Catch
'
注意,这里是CER
Finally
'
这里也是CER
End
Try
一般情况下都用Finally块来做CER。CER与普通代码不同,在CER执行期间CLR不能发出异步异常。因此CLR就必须采取一些措施。首先CER会将ThreadAbortException推迟到CER结束之后才发生,这比较容易做到。第二,为了避免OutOfMemoryException,CLR会将CER中用到的所有方法(注意,这里是从代码静态观察,而不是实际调用的方法)以及这些方法所调用到的所有方法全都编译成本地代码,然后根据情况预测可能的内存不足并提前到CER之前引发。然而,这个方法并不能对付堆栈益处错误,所以这个方法会事先保留48K的栈空间以防万一。然而根据MSDN文档,StackOverflowException还是可能会发生的。
为了确保CER这种原理能够工作,首先CER之内不能在堆上进行任何分配操作,包括后台进行的分配操作。除了不能用New分配引用类型的对象之外,也不能进行装箱、线程同步锁操作或者访问多维数组。
刚才介绍到,CLR会事先编译CER中所有用到的方法以及它们各自调用的所有方法。那么聪明的人一定能看出一个问题,那就是通过委托和虚函数机制调用的方法无法事先准确判断,因而就无从准备。因此,RuntimeHelpers还提供了两个方法——PrepareMethod和PrepareDelegate。调用之前务必用这两个方法准备所有虚函数的实际版本和委托变量。使用CER是需要极其小心准备的,因此不是随随便便使用的特性。RuntimeHelpers还有许多其它方法对应各种有变数的情况。总之,CER的宗旨就是在执行之前将所有可以知道的情况尽数分析透彻以便提前判断CER中的操作到底有没有可能顺利完成。
下面用ThreadAbortException来做一个试验,因为这个异常是最容易引发的:
Imports
System.Runtime.CompilerServices
Imports
System.Threading
Module Module1
Module
Module1
Dim
globalArray()
As
Integer
Sub Main()
Sub
Main()
globalArray
=
New
Integer
(
50000000
) {}
Dim
t
As
New
Thread(
AddressOf
Thread1)
t.Start()
t.Abort()
t.Join()
Console.WriteLine(AllEquals(globalArray,
100
))
End Sub
Function AllEquals()
Function
AllEquals(Of T)(
ByVal
arr()
As
T,
ByVal
value
As
T)
As
Boolean
For
i
As
Integer
=
0
To
arr.Length
-
1
If
Not
arr(i).Equals(value)
Then
Return
False
Next
Return
True
End Function
Sub Thread1()
Sub
Thread1()
RuntimeHelpers.PrepareConstrainedRegions()
Try
Finally
For
i
As
Integer
=
0
To
50000000
globalArray(i)
=
100
Next
End
Try
End Sub
End Module
先把准备CER的代码注释掉,可以发现这个方法不是总能执行成功的,ThreadAbortException可能会将数组的操作打断,以至于留下不正常的状态。如果在你的计算机上该方法不会失败,可以尝试改变数组的大小。接下来应用CER,会发现出现异常时程序执行的速度剧烈下降,但是最终方法总能够成功地完成。这就是CER所带来的好处。
原文出处:
http://blog.joycode.com/ninputer/
posted on 2008-03-12 18:13
投石问路
阅读(50)
评论(0)
编辑
收藏
所属分类:
C#
社区
新闻
新用户注册
刷新评论列表
标题
姓名
主页
Email
(只有博主才能看到)
验证码
*
看不清,换一张
[
登录
][
注册
]
内容(请不要发表任何与政治相关的内容)
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
相关文章:
.NET设计模式系列文章
使用Visual Studio2005入门.Net2.0系列视频教程
ASP.NET AJAX入门系列
prototype.js 1.4版开发者手册(强烈推荐)
ASP.NET 大文件上传组件[无组件上传](AspnetUpload 2.3 release)[免费版序列号放送中...]
编译调试CSLA .NET Framework v1.5
相关链接:
所属分类的其他文章:
Excel开发(VSTO2005):简化工作表中选定区域的操作。[轉載]
.NET 2.0 CER学习笔记 [转载]
格式化类型连接地址
ASP.NET 视频截图功能的C#代码[转载]
NET 2.0(C#)调用ffmpeg处理视频的方法
在ASP.Net中实现flv视频转换 [转载]
在C#中如何读写INI文件
在 .NET 中获取 AD 上帐号密码过期时间
.Net实现支持断点续传多线程下载
C#断点续传
最新IT新闻:
美国年轻人最喜欢的15大网站
2008年8月30日IT博客精选
《极品飞车12》最新真人照片、游戏截图
IBM正在开发超强性能4TB固态硬盘阵列
Microsoft F# CTP(2008年9月)
博客园新闻频道
博客园首页
社区
<
2008年3月
>
日
一
二
三
四
五
六
24
25
26
27
28
29
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
与我联系
发短消息
搜索
常用链接
我的随笔
我的空间
我的短信
我的评论
更多链接
我的参与
我的新闻
最新评论
我的标签
留言簿
(4)
给我留言
查看留言
随笔分类
.Net Remoting(3)
(rss)
ACCESS(1)
(rss)
ActiveX(1)
(rss)
AJAX
(rss)
AjaxPro(2)
(rss)
ASP(11)
(rss)
ASP.NET(37)
(rss)
ASP.NET 2.0(35)
(rss)
C#(63)
(rss)
Excel开发(VSTO2005)(1)
(rss)
Flash(3)
(rss)
Flex(1)
(rss)
IIS(1)
(rss)
JavaScript(19)
(rss)
Office(4)
(rss)
PHP(1)
(rss)
SQLSERVER(27)
(rss)
VB.NET(1)
(rss)
Web Service(10)
(rss)
WinForm(1)
(rss)
多媒体(8)
(rss)
泛型技巧系列
(rss)
其它(1)
(rss)
启发文章(1)
(rss)
水晶报表(1)
(rss)
委托(3)
(rss)
文件传输(3)
(rss)
线程(11)
(rss)
消息队列MSMQ(2)
(rss)
异步编程(3)
(rss)
正则表达式(3)
(rss)
随笔档案
2008年6月 (3)
2008年5月 (1)
2008年3月 (21)
2008年2月 (1)
2008年1月 (42)
2007年11月 (1)
2007年10月 (1)
2007年9月 (11)
2007年8月 (11)
2007年7月 (2)
2007年5月 (1)
2007年4月 (1)
2007年3月 (1)
2007年1月 (8)
2006年11月 (1)
2006年10月 (8)
2006年9月 (1)
2006年8月 (2)
2006年7月 (1)
2006年5月 (18)
2006年4月 (14)
2006年3月 (32)
相册
生活照
收藏夹
AJAX(5)
(rss)
ASP(2)
(rss)
CodeSmith(2)
(rss)
Enterprise Library(2)
(rss)
install shield (1)
(rss)
LINQ(3)
(rss)
Remoting(2)
(rss)
SAP(6)
(rss)
Silverlight(3)
(rss)
报表(2)
(rss)
多媒体
(rss)
泛型技巧系列(1)
(rss)
其它(6)
(rss)
其它文章(1)
(rss)
网页设计(1)
(rss)
友情链接(3)
(rss)
.NET 优秀网站
.NET 官方网www.asp.net
.NET开发资源精华收
aspfree
C#开源资源
codeproject(开源项目)
MSDN中文
世界上最大的Open Source项目在线网站
DHTML连接
bindows(RSS)
DHTML menu4作者主页(RSS)
大量DHTML代码
无忧脚本 - JavaScript
博客
基础知识详解
技术手册
网站开发 速查手册
友情连接
.NET 控件与组件开发
LTP.Net代码自动生成器 博客
Office 开发技术
Outman 博客
SPL作者(听棠.NET)
TerryLee技术专栏
阿良.NET
枫的专栏
广州.NET俱乐部
开源项目团队
凌风的.NET专栏
(rss)
清清月儿
深圳.NET俱乐部
图形报表
无为搜索 博客
无涯空间
中国建站之家
邹健的博客(数据库)
最新随笔
1. 讲解SQL 2000的Collection排序规则 (3)[转]
2. 讲解SQL 2000的Collection排序规则 (2)[转]
3. 讲解SQL 2000的Collection排序规则 (1)[转]
4. IIS出现server application error,解决方案一
5. C#动态获取当前屏幕中光标所在位置的颜色
6. Excel开发(VSTO2005):简化工作表中选定区域的操作。[轉載]
7. .NET 2.0 CER学习笔记 [转载]
8. 格式化类型连接地址
9. FLV Flash video streaming with ASP.NET 2.0, IIS and HTTP handler [转载]
10. ASP.NET 视频截图功能的C#代码[转载]
积分与排名
积分 - 24600
排名 - 1660
最新评论
1. re: 导出GridView到Excel中(转)
不顶不行
--wanghao2979
2. re: 总结: 重复提交、重复刷新、防止后退的问题以及处理方式 (来自CSDN)
dfgdsgdf
--dfgdg
3. re: 加密(Asp.Net配置文件的)配置节
用了一段时间的web form 没有好好看过web.config文件,谢谢你提供的资料!如果您有讲解web.config中配置的资料请给我发一份好吗?
kaola526@163.com
--胡伟雄
阅读排行榜
1. ActiveX and Com(转)(3514)
2. 了解如何获取并安装 Office 2003 主 interop 程序集 (PIA) 和如何对其进行引用以及疑难解答 (913)
3. 制作一个带三态CheckBox的Tree [转](565)
4. ASP.NET 2.0构建动态导航的Web应用程序(TreeView和Menu ) (564)
5. FLV播放器 源码二例[转载](452)
评论排行榜
1. ActiveX and Com(转)(3)
2. .net关于企业Excel报表的生成 (转)(3)
3. C#中调用Windows API时的数据类型对应关系(2)
4. excel插入行的问题(2)
5. 将自定义.NET控件嵌入IE浏览器 (2)
Powered by:
博客园
Copyright © 投石问路