一:IHttpModule的Init()只執行一次:
IHtttpModule.Init()方法是在Application啟動時進行一些初始化操作,因此,該方法只需要而且也只會執行一次.
因此,在該方法裡調用的方法也只會執行一次(我們可以在其中實現Timer,FileSystemWatcher等的操作).
當然,其中的Application相關事件是在這一步註冊.
----
需要注意的是,有些情況下,Init()也會多次執行,比如使用架構時就會執行不止一次...
http://www.cnblogs.com/redfire0922/archive/2007/03/15/675549.html
這裡有位朋友就碰到類似問題.
二:記憶體回收,Dispose,Close,Finalie(C#中的解構函式)
.NET中的資源分託管和非託管,所謂的託管是指CLR(通用語言運行時)中進行管理的資源,它可以由CLR自動進行記憶體回收.
也就是大家熟知的GC(記憶體回收機制).
而對於 非託管資源,比如資料庫連接,COM串連等,那麼需要手動清理回收資源.
清理非託管資源,我們可以用解構函式來執行,雖然它的執行時機不確定,但終究會被執行.
當然還有Dispose()和Close()方法,兩者的區別在於,Close()後還要以用Open()開啟,而Dispose()則是徹底銷毀.
---
使用解構函式時,需要GC.Collect()才會執行到(GC,Collect()在自動回收機制中會自動執行,也可以顯式調用它)
而Dispose()需要顯式地調用,或者使用using()
,但是,需要注意:在用解構函式時,至少分兩步走:調用函數,回收記憶體.
那麼,在用using()或*.Dispose()後,GC還會再去執行解構函式.
因此,在Dispose()裡,加上GC.SupressFinalize(this)來防止再次調用解構函式.
總結:
Dispose()和Close()需要顯示調用,Dispose()可以通過using()調用.解構函式無法顯式調用.
Dispose()和解構函式是銷毀對象,而Close()是關閉,可以通過Open()再開.
解構函式調用時機不確定,而Dispose()在顯式或Using()時執行,Close()在顯式時執行.
三者都是用來銷毀非託管對象.
一段經典的C#-Dispose: 1private bool _isDisposed=false;
2~MyTest()
3 {
4 //this.Close();
5 Dispose(false);
6 }
7 /**//// <summary>
8 /// 記憶體釋放,需要此類執行個體顯式調用,如sql.Dispose();或Using()
9 /// </summary>
10 public void Dispose()
11 {
12 //IDisposable dispose = this as IDisposable;
13 //if(dispose!=null)
14 //{
15 // dispose.Dispose();
16 //}
17 Dispose(true);
18 GC.SuppressFinalize(this);
19 }
20 protected virtual void Dispose(bool disposing)
21 {
22 if(!_isDisposed)
23 {
24 if(disposing)
25 {
26 //託管資源的釋放
27 }
28 //非託管資源的釋放
29 _isDisposed = true;
30 }
31 }