C#记一次静态变量的坑
2017-11-03 18:06
176 查看
有时为了加快显示的速度,会将相对不变的数据给缓存起来。在缓存起来时,比较直接的方法是放到静态变量中。
在项目中,由于需要从服务器中捞起较多的数据,一般要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>。
总结:当我们使用静态变量作为缓存时,一定要考虑好生存期和作用域,否则会造成莫名其妙的问题而难以查起。
在项目中,由于需要从服务器中捞起较多的数据,一般要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>。
总结:当我们使用静态变量作为缓存时,一定要考虑好生存期和作用域,否则会造成莫名其妙的问题而难以查起。
相关文章推荐
- C#访问openfire服务器之三:一次成功的登录
- 局部静态变量是如何做到只初始化一次的?
- C#程序在一个终端中只允许打开一次,防止多次打开
- [c#]记一次实验室局域网的ARP欺骗
- C#与Erlang的一次Socket通信
- C#之WinForm基础 得到文件对话框(一次只能打开一个文件)打开文件的绝对路径
- “茴”字的几种写法——C#中静态构造函数和静态变量文字执行顺序问题
- C#中 一次执行多条带GO的sql语句
- C#实现一次只能打开一个客户端以及关闭自动重启的问题
- c# 仿照计划任务(定时提示、定时运行程序、定时打开url(前台/后台))/每天/每周/每月/一次 多时间段
- C#正则表达式基础 + [0-9]+ 字符串中出现一次或者多次数字
- [原创]C# 与 汇编 的一次亲密接触。
- C# FTP类,以前优化过一次,增加了对编码的识别,今天新增了主被动模式
- 详解C#把DataTable中数据一次插入数据库的方法
- C#的文件读写操作--流方式一次读写文件
- 设置C#窗体程序只能启动一次
- C#静态变量
- C# 同一窗体一次只打开一个
- C#.NET WINFORM应用程序中控制应用程序只启动一次
- c# 程序只能运行一次(多次运行只能打开同一个程序) 并激活第一个实例,使其获得焦点,并在最前端显示.