彩票走势图

WPF 4.5探秘之二 改进WeakEventManager

原创|其它|编辑:郝浩|2012-08-22 02:22:13.000|阅读 916 次

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

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

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

本篇文章是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
}


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn

文章转载自:外文翻译

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP