当前位置: 首页 > news >正文

网站开发网络seo中文

网站开发网络,seo中文,网站建设需要建站公司沟通哪些,温州龙湾区全网seo优化品牌本文内容 先决条件为什么要实现弱事件模式?应该由谁实现弱事件模式?如何实现弱事件模式 在应用程序中,附加到事件源的处理程序可能不会与将处理程序附加到源的侦听器对象一同销毁。 这种情况下会导致内存泄漏。 Windows Presentation Found…

本文内容

  1. 先决条件
  2. 为什么要实现弱事件模式?
  3. 应该由谁实现弱事件模式?
  4. 如何实现弱事件模式

在应用程序中,附加到事件源的处理程序可能不会与将处理程序附加到源的侦听器对象一同销毁。 这种情况下会导致内存泄漏。 Windows Presentation Foundation (WPF) 引入了可用于解决此问题的设计模式。 设计模式为特定事件提供专用的管理器类,并在该事件的侦听器上实现接口。 此设计模式称为弱事件模式。

1、先决条件

本文假定你对路由事件有基本的了解,并且已阅读
路由事件概述。 若要遵循本文中的示例,如果熟悉 Extensible Application Markup Language (XAML) 并知道如何编写 Windows Presentation Foundation (WPF) 应用程序,将会很有帮助。

2、为什么要实现弱事件模式?

对事件的侦听可能会导致内存泄漏。 侦听事件的常用技术是使用特定于语言的语法,将处理程序附加到源上的事件。 例如,C# 语句 source.SomeEvent += new SomeEventHandler(MyEventHandler) 或 VB 语句 AddHandler source.SomeEvent, AddressOf MyEventHandler。 然而,此技术可创建从事件源到事件侦听器的强引用。 除非显式注销事件处理程序,否则侦听器的对象生存期将受到源的对象生存期的影响。 在某些情况下,你可能希望通过其他因素(例如,当前是否属于应用程序的可视化树)控制侦听器的对象生存期。 每当源的对象生存期超出侦听器的有用对象生存期时,侦听器的存活时间比必要时间要长。 在这种情况下,未分配的内存相当于内存泄漏。

弱事件模式旨在解决内存泄漏问题。 当侦听器需要注册事件时,都可以使用弱事件模式,但侦听器并不明确知晓事件会在何时注销。 当源的对象生存期超过侦听器的有用对象生存期时,也可以使用弱事件模式。 在这种情况下,有用与否将由你来决定。 弱事件模式允许侦听器注册事件和接收事件,而不会以任何方式影响侦听器的对象生存期特征。 实际上,对源的隐式引用并不能确定侦听器是否有资格执行垃圾回收。 由于是弱引用,因而引用是对弱事件模式和相关 API 的命名。 侦听器可以被垃圾回收或以其他方式销毁,而源可以继续运行,无需保留针对现已销毁的对象的不可回收的处理程序引用。

3、应该由谁实现弱事件模式?

弱事件模式主要与控件作者相关。 控件作者主要负责控件行为和控件包含,以及控件对其所插入的应用程序的影响。 这包括控件对象生存期行为,特别是处理所述的内存泄漏问题。

某些方案本身就适合应用弱事件模式。 此类方案之一是数据绑定。 在数据绑定中,源对象通常独立于作为绑定目标的侦听器对象。 WPF 数据绑定的许多方面已经在事件的实现方式上应用了弱事件模式。

4、如何实现弱事件模式

有四种方法可以实现弱事件模式,每种方法都使用不同的事件管理器。 选择最适合你的方案的事件管理器。

  • 现有弱事件管理器

    当要订阅的事件具有对应的 WeakEventManager,请使用现有的弱事件管理器。 有关 WPF 附带的弱事件管理器列表,请参阅 WeakEventManager 类中的继承层次结构。 由于包含的弱事件管理器有限,可能需要选择其他方法中的一个。


  • 通用弱事件管理器:

    如果现有的 WeakEventManager<TEventSource,TEventArgs> 事件不可用,并且你正在寻找实现弱事件的最简单方法,请使用泛型 WeakEventManager。 但是,泛型 WeakEventManager<TEventSource,TEventArgs> 比现有或自定义弱事件管理器更低效,因为它使用反射从其名称中发现事件。 此外,使用泛型 WeakEventManager<TEventSource,TEventArgs> 注册事件所需的代码比使用现有或自定义 WeakEventManager 注册事件所需的代码更详细。


  • 自定义弱事件管理器:

    在现有 WeakEventManager 不可用且效率至关重要时,创建自定义的 WeakEventManager。 尽管比泛型 WeakEventManager 更有效,但自定义 WeakEventManager 要求编写更多前期代码。

  • 第三方弱事件管理器:

  • 当需要其他方法未提供的功能时,请使用第三方弱事件管理器。 NuGet 具有一些较弱的事件管理器

以下部分介绍如何通过使用不同的事件管理器类型来实现弱事件模式。 对于泛型和自定义弱事件管理器示例,要订阅的事件具有以下特征。

  • 事件名称为 SomeEvent
  • 事件由 SomeEventSource 类引发。
  • 事件处理程序的类型为 EventHandler<SomeEventArgs>
  • 事件将 SomeEventArgs 类型的参数传递给事件处理程序。

4.1 使用现有弱事件管理器类

  1. 查找现有弱事件管理器。 有关 WPF 附带的弱事件管理器列表,请参阅 WeakEventManager 类的继承层次结构。

  2. 使用新的弱事件管理器,而不是普通事件挂钩。

    例如,如果代码使用以下模式订阅事件:

    source.LostFocus += new RoutedEventHandler(Source_LostFocus);
    

    将其更改为以下模式:

    LostFocusEventManager.AddHandler(source, Source_LostFocus);
    

    同样,如果代码使用以下模式取消订阅事件:

    source.LostFocus -= new RoutedEventHandler(Source_LostFocus);
    

    将其更改为以下模式:

    LostFocusEventManager.RemoveHandler(source, Source_LostFocus);
    

4.2 使用泛型弱事件管理器类

使用泛型 WeakEventManager<TEventSource,TEventArgs> 类,而不是普通事件挂钩。

使用 WeakEventManager<TEventSource,TEventArgs> 注册事件侦听器时,需要将事件源和 EventArgs 类型作为类型参数提供给类。 调用 AddHandler,如以下代码所示:

WeakEventManager<SomeEventSource, SomeEventArgs>.AddHandler(source, "SomeEvent", Source_SomeEvent);

4.3 创建自定义弱事件管理器类

  1. 将以下类模板复制到项目。 以下类继承自 WeakEventManager 类:

    class SomeEventWeakEventManager : WeakEventManager
    {private SomeEventWeakEventManager(){}/// <summary>/// Add a handler for the given source's event./// </summary>public static void AddHandler(SomeEventSource source,EventHandler<SomeEventArgs> handler){if (source == null)throw new ArgumentNullException(nameof(source));if (handler == null)throw new ArgumentNullException(nameof(handler));CurrentManager.ProtectedAddHandler(source, handler);}/// <summary>/// Remove a handler for the given source's event./// </summary>public static void RemoveHandler(SomeEventSource source,EventHandler<SomeEventArgs> handler){if (source == null)throw new ArgumentNullException(nameof(source));if (handler == null)throw new ArgumentNullException(nameof(handler));CurrentManager.ProtectedRemoveHandler(source, handler);}/// <summary>/// Get the event manager for the current thread./// </summary>private static SomeEventWeakEventManager CurrentManager{get{Type managerType = typeof(SomeEventWeakEventManager);SomeEventWeakEventManager manager =(SomeEventWeakEventManager)GetCurrentManager(managerType);// at first use, create and register a new managerif (manager == null){manager = new SomeEventWeakEventManager();SetCurrentManager(managerType, manager);}return manager;}}/// <summary>/// Return a new list to hold listeners to the event./// </summary>protected override ListenerList NewListenerList(){return new ListenerList<SomeEventArgs>();}/// <summary>/// Listen to the given source for the event./// </summary>protected override void StartListening(object source){SomeEventSource typedSource = (SomeEventSource)source;typedSource.SomeEvent += new EventHandler<SomeEventArgs>(OnSomeEvent);}/// <summary>/// Stop listening to the given source for the event./// </summary>protected override void StopListening(object source){SomeEventSource typedSource = (SomeEventSource)source;typedSource.SomeEvent -= new EventHandler<SomeEventArgs>(OnSomeEvent);}/// <summary>/// Event handler for the SomeEvent event./// </summary>void OnSomeEvent(object sender, SomeEventArgs e){DeliverEvent(sender, e);}
    }
    
  2. 重命名 SomeEventWeakEventManagerSomeEventSomeEventSource 和 SomeEventArgs 以匹配事件名称。

  3. 设置弱事件管理器类的
    访问修饰符,用于匹配其管理的事件的可访问性。

  4. 使用新的弱事件管理器,而不是普通事件挂钩。

    例如,如果代码使用以下模式订阅事件:

    source.SomeEvent += new EventHandler<SomeEventArgs>(Source_SomeEvent);
    

    将其更改为以下模式:

    SomeEventWeakEventManager.AddHandler(source, Source_SomeEvent);
    

    同样,如果代码使用以下模式取消订阅事件:

    source.SomeEvent -= new EventHandler<SomeEventArgs>(Source_SomeEvent);
    

    将其更改为以下模式:

    SomeEventWeakEventManager.RemoveHandler(source, Source_SomeEvent);
    

http://www.hengruixuexiao.com/news/34845.html

相关文章:

  • 要加强县门户网站的建设管理办法seo软件优化工具软件
  • 专注于上海seo做网站建设滁州网站seo
  • 网络网站百度地图推广怎么收费标准
  • 厦门做网站优化公司刷粉网站推广便宜
  • 怎么设置网站找小网站的关键词
  • 做网站优化公司报价做网上营销怎样推广
  • 微信手机网站搭建安徽搜索引擎优化
  • 中国建设银行网站首页下载福州关键词优化平台
  • 南京市建设局网站微信运营
  • 南宁建筑网站推销一个产品的方案
  • h5网站建设哪家好seo检查工具
  • 电影网站制作教程好不好seo网络运营
  • 安徽网络优化方案百度seo推广首选帝搜软件
  • 网站做多个镜像广州关键词seo
  • 做 理财网站好郑州黑帽seo培训
  • 捷讯官网 网站建设互联网广告行业分析
  • 给诈骗犯做网站东莞网站制作
  • 网站建设预算策划百度技术培训中心
  • 江门网站推广策划计算机培训班有用吗
  • 南宁致峰网站建设营销引流都有什么方法
  • wordpress微信商户支付免费的seo优化
  • 许昌网站建设百度一下就知道官方
  • 仙桃做网站找谁广州百度竞价开户
  • 烟台企业网站怎么优化长春模板建站代理
  • 做衣服的教程网站有哪些优化网站性能监测
  • 代做maya三维动画的网站广州王牌seo
  • 网站安全如何做sem是什么检测分析
  • 网站开发培训哪个好知乎营销平台
  • 个人网站简单今天nba新闻最新消息
  • 合肥网站的建设谷歌seo实战教程