我的應用程序中有一些靜態類。 當我運行應用程序時,停止調試並重新啓動我注意到這些變量保留在內存中! 因此,當應用程序終止時,它們被留下並重新連接到應用程序的下一個實例。 這會產生如你所期望的非常瘋狂的結果。當我停止我的應用程序時,ASP.NET靜態變量仍然存在!
您可以編程式告訴靜態變量在應用程序終止時自行銷燬嗎?
我的應用程序中有一些靜態類。 當我運行應用程序時,停止調試並重新啓動我注意到這些變量保留在內存中! 因此,當應用程序終止時,它們被留下並重新連接到應用程序的下一個實例。 這會產生如你所期望的非常瘋狂的結果。當我停止我的應用程序時,ASP.NET靜態變量仍然存在!
您可以編程式告訴靜態變量在應用程序終止時自行銷燬嗎?
只要包含它們的AppDomain保持活動狀態,靜態變量就會保持不變。如果您看到它們在調試會話之間持續存在,那意味着當您停止調試時,應用程序不會停止運行 - 這兩次都是相同的實例。嘗試重新啓動Web服務器。
我想補充一點,如果一個事實,即靜態變量往往是持續性是導致瘋狂的結果,你可能不使用他們的權利,並可能不應該使用在所有靜態變量。
停止調試器不會停止IIS或Cassini。
如果您使用的是卡西尼,您需要將其從命令托盤中明確停止以便將其回收。
否則,您可以嘗試修改web.config來強制回收。
我在Connect上提交了一個關於這個的bug;微軟表示這是「按設計」。
這不會使靜態變量在ASP.NET中完全無用嗎?我的意思是,誰會編寫代碼來啓動/停止Web服務器,僅僅是因爲他們在代碼中使用了「static」這個詞? – Petras 2009-12-02 23:14:55
這取決於你正在使用它們。它們可能很有用,但是它們使測試變得困難,並且如果它們不是隻讀變量,則需要手動管理鎖定等以避免負載下的融化。你可能會更好地將你的值存儲在應用程序狀態中:'Application [「foo」] = value;' – 2009-12-02 23:18:15
Application對象只是另一個靜態變量。它恰巧也有一些管理鎖定的方法,但它的行爲與其他靜態變量沒有根本的區別。 – RickNZ 2009-12-04 00:20:29