zoukankan      html  css  js  c++  java
  • WPF外包就找北京动点飞扬 — WPF 4.5探秘之二 改进WeakEventManager

    内存泄露曾经、现在、以后在应用程序中永远也将是一个关注点,它的一个最初的起源是unsubscribed事件的处理程序。weak event pattern对内存的泄露能够起到一定的作用,但是还没有实施。在本文中,我们将看到 WPF使用 WeakEventManager 类时,所起到的作用。

      本篇文章是WPF 4.5新特性的系列的一部分。

      eneric Weak Event Manager

      之前的WPF 4.5对于每个你想订阅的事件,必须创建一个a weak event manger,现在就不用这样了,你可以使用一个通用版本的WeakEventManager类。

      需要作为一个通用的参数的类型的事件的源和类型的的dealed事件参数。

    // Type parameters:
    // TEventSource:
    // The type that raises the event.
    //
    // TEventArgs:
    // The type that holds the event data.
    public class WeakEventManager<TEventSource, TEventArgs> :
    WeakEventManager where TEventArgs : EventArgs

      它也展现出来了两个静态变量的方法:

      AddHandler在一个给定源的事件上添加一个处理程序,它将采用事件的名称作为参数。

      RemoveHandler删除一个处理程序。

      由于这是使用反射,在使用这个对象的时候,在性能上边会有一点小的开销。

      订阅的接口

      在之前的WPF 4.5中,weak-event的每个订阅必须实现IWeakEventListener,这个接口非常的简单:

      public bool ReceiveWeakEvent(Type managerType, object sender, EventArgs e)

      即使它能够简单快捷的实现,但是确实相当的单调的,如果想要实现更多它没有的需求,你只需要在订阅时传递一个委托即可!

      举个例子:

      比如说你有一个应用程序,在程序里面有主窗口,有时显示一些子窗口。当应用程序出现的时候,这些子窗口订阅激活了主窗口事件,通过使用传统的事件订 阅,您可以创建内存泄漏,如果您还没有注册它。在另一方面,你可以使用的WeakEventManager订阅此事件,你从来没有听说过了吧!

      下面是一个例子使用的代码:

    //Create 10 Mo to be more visible in the process explorer
    public byte[] data = new byte[10 * 1024 * 1024];

    public LeakingWindow()
    {
    InitializeComponent();
    WeakEventManager<Window, EventArgs>
    .AddHandler(App.Current.MainWindow, "Activated", MainWindow_Activated);

    //Traditional event subscription: memory leak !
    App.Current.MainWindow.Activated += MainWindow_Activated;
    }

    void MainWindow_Activated(object sender, EventArgs e)
    {
    //Do something here
    }
  • 相关阅读:
    vs项目属性中的包含目录和库目录以及附加依赖项全都配置正确了,却还是提示:无法解析的外部符号
    开发六年mybatisplus使用小结
    去“BAT”这样面试,拿到offer的几率是80%
    阿里P7级教你如何在Spring Boot应用程序中使用Redis
    为什么Java大数据能带你走上人生巅峰
    惊呆!Java程序员等级一览
    不要做一个只会面向搜索编程的程序员
    三年总结出来的11个JPA和Hibernate查询配置小技巧
    阿里高级架构师教你使用Spring JMS处理消息事务源码案例
    阿里高级架构师教你使用Spring Cloud Sleuth跟踪微服务
  • 原文地址:https://www.cnblogs.com/dotfun/p/2721212.html
Copyright © 2011-2022 走看看