一个有意思的.net应用bug

1 篇文章 0 订阅

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~


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值