日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.NET 2.0 CER学习笔记

發(fā)布時間:2025/7/14 asp.net 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .NET 2.0 CER学习笔记 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
CER是.NET 2.0 CLR方面的重要改進,旨在幫助那些對穩(wěn)定性高度苛刻的程序?qū)Ω?NET Framework的不穩(wěn)定因素。因為普通的程序很少會用到,所以一直沒有對這個特性加以足夠重視。現(xiàn)在碰巧在翻譯書籍的過程中用到,就一起來學習一下。
首先,需要提到異步異常的問題。異步異常就是指OutOfMemoryException、StackOverflowException和ThreadAbortException等系統(tǒng)異常。說他們“異步”是因為他們可以在線程代碼執(zhí)行到任何地方的時候發(fā)生。一般的異常,比如FileNotFoundException是由代碼自己產(chǎn)生的,因此可以用Try語句正常捕捉和處理。而異步異常則是CLR產(chǎn)生的。而且,這些異常都預示著非常嚴重的錯誤,代碼自己通常都會手足無措。比方說內(nèi)存耗盡了,代碼自己即使Catch了也無濟于事,都不知道剛剛哪一步出的問題,也不知道該怎么繼續(xù)執(zhí)行。ThreadAbortException通常是由Thread.Abort方法引發(fā),如果要Abort的線程正在進行很關(guān)鍵的人物,比如修改一個全局對象的狀態(tài),那么發(fā)生ThreadAbortException可能會讓整個程序的狀態(tài)受損,進而產(chǎn)生錯誤的行為。因此,需要有種機制告訴CLR,我們要進行的事情很關(guān)鍵,不容打斷,這就是CER——Constrained Execution Region。
聲明CER很簡單,先調(diào)用System.Runtime.CompilerServices.RuntimeHelpers.PrepareConstrainedRegions()方法,再緊接一個Try...Catch...Finally塊即可。注意,這個Try必須緊接著PrepareConstrainedRegions()方法,而且,只有Catch和Finally塊的內(nèi)容成為CER。如下所示
RuntimeHelpers.PrepareConstrainedRegions()
Try
Catch
????
'注意,這里是CER
Finally
????
'這里也是CER
End?Try 一般情況下都用Finally塊來做CER。CER與普通代碼不同,在CER執(zhí)行期間CLR不能發(fā)出異步異常。因此CLR就必須采取一些措施。首先CER會將ThreadAbortException推遲到CER結(jié)束之后才發(fā)生,這比較容易做到。第二,為了避免OutOfMemoryException,CLR會將CER中用到的所有方法(注意,這里是從代碼靜態(tài)觀察,而不是實際調(diào)用的方法)以及這些方法所調(diào)用到的所有方法全都編譯成本地代碼,然后根據(jù)情況預測可能的內(nèi)存不足并提前到CER之前引發(fā)。然而,這個方法并不能對付堆棧益處錯誤,所以這個方法會事先保留48K的棧空間以防萬一。然而根據(jù)MSDN文檔,StackOverflowException還是可能會發(fā)生的。
為了確保CER這種原理能夠工作,首先CER之內(nèi)不能在堆上進行任何分配操作,包括后臺進行的分配操作。除了不能用New分配引用類型的對象之外,也不能進行裝箱、線程同步鎖操作或者訪問多維數(shù)組。
剛才介紹到,CLR會事先編譯CER中所有用到的方法以及它們各自調(diào)用的所有方法。那么聰明的人一定能看出一個問題,那就是通過委托和虛函數(shù)機制調(diào)用的方法無法事先準確判斷,因而就無從準備。因此,RuntimeHelpers還提供了兩個方法——PrepareMethod和PrepareDelegate。調(diào)用之前務(wù)必用這兩個方法準備所有虛函數(shù)的實際版本和委托變量。使用CER是需要極其小心準備的,因此不是隨隨便便使用的特性。RuntimeHelpers還有許多其它方法對應(yīng)各種有變數(shù)的情況。總之,CER的宗旨就是在執(zhí)行之前將所有可以知道的情況盡數(shù)分析透徹以便提前判斷CER中的操作到底有沒有可能順利完成。
下面用ThreadAbortException來做一個試驗,因為這個異常是最容易引發(fā)的:
Imports?System.Runtime.CompilerServices
Imports?System.Threading

Module?Module1Module?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的代碼注釋掉,可以發(fā)現(xiàn)這個方法不是總能執(zhí)行成功的,ThreadAbortException可能會將數(shù)組的操作打斷,以至于留下不正常的狀態(tài)。如果在你的計算機上該方法不會失敗,可以嘗試改變數(shù)組的大小。接下來應(yīng)用CER,會發(fā)現(xiàn)出現(xiàn)異常時程序執(zhí)行的速度劇烈下降,但是最終方法總能夠成功地完成。這就是CER所帶來的好處。
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的.NET 2.0 CER学习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。