• WeakEventHandler: Avoiding GC Problem by Strong Reference of an Event


    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace TestWeakReference
    {
        
    class WeakEventHandler<T> : WeakReference where T : EventArgs
        {
            
    public WeakEventHandler() : base(null) { }

            
    public WeakEventHandler(EventHandler<T> handler) : base(handler) { }

            
    public WeakEventHandler(EventHandler<T> target, bool trackResurrection) : base(target, trackResurrection) { }

            
    public new EventHandler<T> Target
            {
                
    get
                {
                    
    return (EventHandler<T>)base.Target;
                }
                
    set
                {
                    
    base.Target = value;
                }
            }

            
    public static explicit operator EventHandler<T>(WeakEventHandler<T> weakEventHandler)
            {
                
    return weakEventHandler.Target;
            }
        }

        
    class EventHost
        {
            
    private WeakEventHandler<EventArgs> _event = new WeakEventHandler<EventArgs>();

            
    public event EventHandler<EventArgs> Event
            {
                add { _event.Target 
    += value; }
                remove { _event.Target 
    -= value; }
            }

            
    public void FireEvent()
            {
                
    if (_event.Target != null)
                {
                    _event.Target(
    this, EventArgs.Empty);
                }
            }
        }

        
    class EventClient
        {
            
    public void SayHello(object obj, EventArgs args)
            {
                Console.WriteLine(
    "Hello~");
            }

            
    ~EventClient()
            {
                Console.WriteLine(
    "Client Dies!");
            }
        }

        
    class Program
        {
            
    static void Main(string[] args)
            {
                EventHost host 
    = new EventHost();
                EventClient client 
    = new EventClient();
                host.Event 
    += client.SayHello;
                host.FireEvent(); 
    // Client will say "Hello~";

                client 
    = null;
                GC.Collect(); 
    // Client dies here!

                host.FireEvent(); 
    // oops, nothing happen
            }
        }
    }


    More about this:
    1. Using Weak References
    2. Simulating “Weak Delegates” in the CLR
    3. An Easy to Use Weak Referenced Event Handler Factory for .NET 2.0

  • 相关阅读:
    CSS文字大小单位px、em、pt
    前台和后台数据传递综合总结
    关于JSON对象,以及联合数组,eval函数的使用参考
    C#整数的三种强制类型转换int、Convert.ToInt32()、int.Parse()的区别
    web.xml配置内容介绍
    Hibernate核心接口SessionFactory解释
    spring简单配置
    hibernate简单实例
    struts简单配置
    web.xml简单配置
  • 原文地址:https://www.cnblogs.com/Dah/p/671141.html
Copyright © 2020-2023  润新知