1. 程式人生 > >C#記一次靜態變數的坑

C#記一次靜態變數的坑

有時為了加快顯示的速度,會將相對不變的資料給快取起來。在快取起來時,比較直接的方法是放到靜態變數中。

在專案中,由於需要從伺服器中撈起較多的資料,一般要3-5秒,網路稍慢的時候會更長時間。而每次顯示介面時,都需要這麼長的時間,顯然是很不友好的。於是,就將這些資料放到了靜態變數A中。而靜態變數A又同時生成了一個選單控制元件Menu1,在選單控制元件Menu1的專案中響應其點選事件MenuItemClick。由於Menu1隨同靜態變數A一起,具有共同的生存期。但是顯示的介面Form是每次都全新建立的,這樣一來,第一次建立Form1使用的是靜態變數A,每二建立Form2使用的依然是靜態變數A。

而選單事件MenuItemClick的響應由於每一次就已經放到了選單項Menu1中,所以會隨同Form1一起,MenuItemClick的響應動作自然的就會響應到Form1中,即更新到Form1的介面上。所以在再次建立Form產生Form2時,選單項的MenuItemClick就會響應到Form1中而不會響應到Form2中。這樣就產生了一個坑。

解決辦法是,將變數A做成一個單例模式的類產生的例項,然後內部封裝一個顯示選單的方法Show。再Show方法中傳入選單顯示所需要的引數,同時再傳入一個響應選單事件MenuItemClick後再呼叫的方法,比如型別為Action<MyData>的action。MyData是MenuItemClick點選後收集到的資料。

這樣一來,就可以確保每次都是同一個例項A,同時因為更新介面的行為是動態傳入的,所以Form1和Form2在呼叫選單顯示時必須傳入相應的更新行為Action<MyData>。

總結:當我們使用靜態變數作為快取時,一定要考慮好生存期和作用域,否則會造成莫名其妙的問題而難以查起。