一个有意思的.net应用bug
2012-12-07 15:04
260 查看
2012-12-04
有一个比较有意思的.net应用的bug。涉及到了.net的几个重要概念。
这是一个wpf的应用,使用了第三方的ribbon控件。
现象是这样的,一个window关闭之后,相同类型的window被再次打开;此时,window对应的contextual ribbon中行为只跟当前active的window的数据无关联。当前window的改变与contextual ribbon变动没有关系了。
调试后的第一发现是,哪怕所有window被关闭(对应的contextual ribbon也不见了),但contextual ribbon中的command一直被执行,而且用的数据都来自第一个window。也就是说,ribbon常驻内存,使用后就被cache了。因为ribbon 会refer到window,被关闭的同类window中的第一个,实际一直没有被GC delete,不然就报null reference异常了。
实际上也是,app会一直refer到ribbon,直到app退出,不然ribbon不会被delete。
所以,我们的目标就是ribbon应该用当前active的window。每个window被关掉后,不应该再用了。
我们发现ribbon会refer到window的地方是这样的
Func(() =>{…},
Presenter.CanShowInfo() // !!!here!!!
);
这样的话,window会被直接refer到而不会被delete。我们的改法是
Func(() =>{…},
() => {Presenter.CanShowInfo() ;}// !!!here!!!
);
因为lambda表达式的lazy特性,它不会refer某一个window的object,而是在用的时候才会去找,所以能找到当前active的window。
Over~
有一个比较有意思的.net应用的bug。涉及到了.net的几个重要概念。
这是一个wpf的应用,使用了第三方的ribbon控件。
现象是这样的,一个window关闭之后,相同类型的window被再次打开;此时,window对应的contextual ribbon中行为只跟当前active的window的数据无关联。当前window的改变与contextual ribbon变动没有关系了。
调试后的第一发现是,哪怕所有window被关闭(对应的contextual ribbon也不见了),但contextual ribbon中的command一直被执行,而且用的数据都来自第一个window。也就是说,ribbon常驻内存,使用后就被cache了。因为ribbon 会refer到window,被关闭的同类window中的第一个,实际一直没有被GC delete,不然就报null reference异常了。
实际上也是,app会一直refer到ribbon,直到app退出,不然ribbon不会被delete。
所以,我们的目标就是ribbon应该用当前active的window。每个window被关掉后,不应该再用了。
我们发现ribbon会refer到window的地方是这样的
Func(() =>{…},
Presenter.CanShowInfo() // !!!here!!!
);
这样的话,window会被直接refer到而不会被delete。我们的改法是
Func(() =>{…},
() => {Presenter.CanShowInfo() ;}// !!!here!!!
);
因为lambda表达式的lazy特性,它不会refer某一个window的object,而是在用的时候才会去找,所以能找到当前active的window。
Over~
相关文章推荐
- PostgreSQL的.NET驱动程序Npgsql中参数对象的一个Bug
- 字符串混淆技术应用 设计一个字符串混淆程序 可混淆.NET程序集中的字符串
- Visual Studio Ultimate 2012 RC win8 Metro应用的一个小bug-样式继承
- 字符串混淆技术应用 设计一个字符串混淆程序 可混淆.NET程序集中的字符串
- 记一个比较有意思的bug,position绝对定位问题
- .Net C# 的一个bug(暂时命名为Bug)
- 应用jfinal发送微信模板消息的一个bug
- TNND终于确认了.Net 3.0中的一个“Bug”
- 正在开发一个非.net得数据表格组件,用到.net应用中去……
- .Net中的AOP系列之构建一个汽车租赁应用
- .NET自定义异常的一个简单应用(转载)
- 关于GUI的一个应用实例,学得越多,越感觉有意思
- 9i控制台访问10g的一个有意思的bug
- .net 未来的一个应用模式
- java web start关于初始堆大小的一个有意思的bug
- .Net GridView 应用:Gridview有一个CheckBox列,在用了分页的情况下,如何取出用户选择的所有记录id
- 一个SoapExcept异常的处理以及.NET平台下WebService应用的一点注意事项
- 使用VS2010为Windows“.NET研究”7编写一个杀手级WPF应用
- Vistual studio 2008的一个很有意思的'Bug'
- [.NET]Visual Studio 2003的一个bug