C#事件发布者订阅者释放,强引用

来源:互联网 发布:手机淘宝不能付款 编辑:程序博客网 时间:2024/05/16 16:57

事件的订阅者和发布者之间一旦添加订阅关系,他们之间即存在强引用,如下例所示,事件的订阅者即使被释放掉,发布者发布消息是事件的订阅者还能做出响应。因此当事件的发布者生命周期比事件的订阅者长时,订阅者的引用还一直存在发布者中,导致内存泄漏或者不应该出现调用的情况下产生了调用。对此应该十分注意。

using System;

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WeakEvents
{
    class Program
    {
        static void Main(string[] args)
        {
            Publisher publisher = new Publisher();
            Subscriber subscriber = new Subscriber();
            publisher.MyEvent += subscriber.EventHandlers;
            //订阅者订阅事件,正常输出
            publisher.OnMyEvent();

            subscriber = null;
            Console.WriteLine("订阅者释放:");
            //订阅者被释放,仍能正常输出
            publisher.OnMyEvent();

            publisher = null;
            Console.WriteLine("发布者释放:");
            //发布者被释放,不能正常输出。?可空调用,不加则空引用错误
            publisher?.OnMyEvent();

            Console.ReadKey();
        }
    }

    class Publisher
    {
        public event EventHandler<EventArgs> MyEvent;
        public void  OnMyEvent()
        {
            if (MyEvent != null)
            {
                MyEvent(this,new EventArgs());
            }
        }
    }

    class Subscriber
    {
        public void EventHandlers(object sender, EventArgs e)
        {
            Console.WriteLine("我能输出!");
            Console.WriteLine();
        }
    }
}