2009-11-08 65 views
0

任何人都可以向我解釋什麼時候發生什麼事情當一個類的實例聲明靜態事件處理程序將持有引用其他類已註冊意圖的事件處理程序的問題,因爲他們是所有靜態會有在asp.net靜態事件處理程序,線程等

下面有一個例子用戶會話之間的任何競爭(我的意思是在一個時間點的系統的他/她的使用),從BlogEngine.Net

Post.Saved += new EventHandler<SavedEventArgs>(Post_Saved); 

提取已保存的課程帖子是靜態的,此活動在整個演出中都會消耗殆盡,另一個用戶的會話將看到帖子保存的活動罪惡它是靜態的嗎?在聲明靜態事件時,我應該注意哪些線程問題?

回答

5

當多個事件處理程序被註冊,因爲是事件(據我所知)順序運行(在順序對其進行連接的),不是同時。所以不應該有任何併發​​問題。

如果事件是靜態的則是,所有用戶會話會認爲這是他們在同一個.NET AppDomain中運行。 (我相信通過「會話」你的意思是一個ASP.NET會話)。

主要的事情要注意與靜態事件是內存泄漏。如果你的事件處理程序是一個實例方法,並將它附加到一個靜態事件中,那麼該靜態事件現在有一個對處理程序被聲明的對象的引用,所以它引用的對象和任何東西都將保留在內存中,直到事件處理程序被分離或者代碼運行的整個AppDomain被卸載。因爲這個原因,你不得不小心處理不再需要的事件處理程序,或者至少確保你的事件處理類沒有引用其他任何東西,所以內存泄漏是最小的。