在線客服
24小時免費咨詢電話:18978941786
客服時間:上午9:30~下午6點
.NET開發(fā)網(wǎng)站過程中易被忽視的問題
收藏 分享 發(fā)布日期:2012-2-12 16:30:44 編輯:admin 文章來源: 點擊率:
在異常處理的時候,特別提醒兩點:
一, 你的數(shù)據(jù)庫關(guān)閉的時候應(yīng)該是在代碼行0028前,而不是后;
二, 有人不習(xí)慣(或者一時疏忽)加上0088行的代碼;
針對[Sample-02]和[sample-03],把打開數(shù)據(jù)庫連接寫在所有的循環(huán)語句之前,如:
clsOraDb.Open(strConn)
Foreach(DataRow row in tabl.select(“”,”ProductID”)
……………
………….
Next
當(dāng)然還有另外一個做法,就是用Using語句,提交.NET應(yīng)用的垃圾收集器自動收集;相關(guān)的文章很多,這里不再特別贅述。
二、對象只管創(chuàng)建應(yīng)用,不管釋放篇
我們繼續(xù)用[Sample-01]的代碼,我們現(xiàn)在看0004行的代碼:
0004 Dim dtResult As New DataTable
誰會發(fā)現(xiàn)它被釋放,你不能,我也不能,從來沒有被釋放過。
“0004”行的代碼解釋是,要在內(nèi)存劃分一個空間給這個定義的對象dtresult;系統(tǒng)要劃分多大的空間呢?呀,我沒有研究過(留給那些有心人吧,呵呵..)。但有一點,要在內(nèi)存劃分一個空間,就是要占用內(nèi)存。那么內(nèi)存有多大呢,不是無限大吧,也是有限的,所有運行上述代碼的最終結(jié)果是,系統(tǒng)的執(zhí)行效率越來越慢,有人就懷疑,我有內(nèi)存1到2G的,加上虛擬內(nèi)存就更大,我只能說你的懷疑沒錯??墒悄愕膽?yīng)用程序就用這么一只函數(shù)嗎?我想肯定不是,所以上百只函數(shù)的應(yīng)用執(zhí)行對內(nèi)存的消耗可想而知。如果是后臺自動運行的程序,及時是一個function,也會讓系統(tǒng)崩潰。這只是一個簡單的例子,有更復(fù)雜的。像這樣的對象應(yīng)用還有:Dataset, Datatable,DataReader,DataAdapter,Datagrid..等。
那么怎么解決這些問題呢:
2.1在Try catch 語句前定義好所用的對象, 如:
Dim dtResult As New DataTable
Dim DR as New DataReader
Dim DS as New Dataset
Try
..
Catch ex As Exception
Throw ex
Finally
End Try
2.2釋放的語句如下
Dim dtResult As New DataTable
Dim DR as New DataReader
Dim DS as New Dataset
Try
..
……………..
Catch ex As Exception
--釋放應(yīng)用的對象
Throw ex
Finally
--使用完后,釋放應(yīng)用的對象
dtResult.dispose --從內(nèi)存里清楚該對象
DR.dispose -從內(nèi)存里清楚該對象
DS.dispose -從內(nèi)存里清楚該對象
End Try
有人習(xí)慣寫成下面這樣:
Dim dtResult As New DataTable
Dim DR as New DataReader
Dim DS as New Dataset
Try
..
‘使用完后,釋放應(yīng)用的對象
dtResult.dispose ‘從內(nèi)存里清楚該對象
DR.dispose ‘從內(nèi)存里清楚該對象
DS.dispose ‘從內(nèi)存里清楚該對象
Catch ex As Exception
‘釋放應(yīng)用的對象
Throw ex
Finally
End Try
這不是也釋放了嗎?我想問的是,如果程序出現(xiàn)異常,它們會釋放嗎 ?我肯定得告訴大家,它們一定不能釋放,為了確保程序的穩(wěn)定運行,我建議大家都來用Try Catch語句。





