C#记一次静态变量的坑

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xxdddail/article/details/78438038

有时为了加快显示的速度,会将相对不变的数据给缓存起来。在缓存起来时,比较直接的方法是放到静态变量中。

在项目中,由于需要从服务器中捞起较多的数据,一般要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>。

总结:当我们使用静态变量作为缓存时,一定要考虑好生存期和作用域,否则会造成莫名其妙的问题而难以查起。

猜你喜欢

转载自blog.csdn.net/xxdddail/article/details/78438038
今日推荐