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