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

Posted on 2007-03-11 20:34 Adrian H. 阅读(446) 评论(4)  编辑 收藏 网摘 所属分类: C#.Net Framework / CLR

Feedback

#1楼    回复  引用  查看    

2008-05-19 10:32 by 风云      
呵呵,我在准备消息总线系列文章的之一就要写这方面的文章,其解决思路是完全一样, 为了解决该内存泄露我实验了很多中方法,最后才摸索出来这么优雅的方法。

#2楼    回复  引用  查看    

2008-05-19 10:33 by 风云      
没想到这么好的文章竟是曲高和寡,我来顶一下

#3楼    回复  引用    

2008-05-19 15:37 by suuny [未注册用户]
好文章,作者真是够努力,

#4楼    回复  引用  查看    

2008-05-20 00:02 by 代码乱了      
真的不错哦,好像当时没有发在首页啊
不知道有没有进行测试的,我有时间要好好的测试一下

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-03-23 19:23 编辑过
Google站内搜索

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》



相关文章:

相关链接: