为什么在以下C#代码的for循环中内存分配继续增加? [英] Why does the memory allocation continue to increase while in the for loop in the following C# code?

查看:74
本文介绍了为什么在以下C#代码的for循环中内存分配继续增加?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

using System;
namespace TestMemoryLeak
{
    class Program
    {
        static void DisplayMemory()
        {
            Console.WriteLine("Total memory: {0:###,###,###,##0} bytes", GC.GetTotalMemory(true));
            Console.WriteLine();
        }
        private static void Main()
        {
            DisplayMemory();
            for (var i = 0; i < 100; i++)
            {
                Console.WriteLine("--- New Listener #{0} ---", i + 1);
                using (var listener = new EventListener())
                {
                    listener.DoSomething();
                }
                GC.Collect();
                DisplayMemory();
            }
            Console.ReadKey();
        }
    }
    class EventRaiser
    {
        public delegate void SomeEventHandler(string eventString);
        public event SomeEventHandler SomeEvent;
        protected virtual void OnSomeEvent(string eventstring)
        {
            var handler = SomeEvent;
            if (handler != null) handler(eventstring);
        }
    }
    class EventListener : IDisposable
    {
        bool _disposed;
        private static readonly EventRaiser EventRaiserInstance = GetEventRaiser();
        public EventListener()
        {
            EventRaiserInstance.SomeEvent += EventRaiserInstanceOnSomeEvent;
        }
        public void DoSomething()
        {
            // Dummy mehthod
        }
        private void EventRaiserInstanceOnSomeEvent(string eventString)
        {
            // Dummy event handler
        }
        private static EventRaiser GetEventRaiser()
        {
            return new EventRaiser();
        }
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
        ~EventListener()
        {
            Dispose(false);
        }
        protected virtual void Dispose(bool disposing)
        {
            if (_disposed)
                return;
            if (disposing)
            {
                // free other managed objects that implement
                // IDisposable only
            }
            // release any unmanaged objects
            // set the object references to null
            _disposed = true;
        }
    }
}

推荐答案

每次创建新的EventListener时,都附加了它从静态对象接收事件。但是你永远不会发布这个事件。

这意味着静态EventRaiser会在创建的每个EventListener上保留一个引用,这样就不能通过GC收集EventListener。



添加您的Dispose方法:

Each time you create a new EventListener, you attached it to receive event from a static object. but you never release this event.
That mean the static EventRaiser will keep a reference on every EventListener created and doing so EventListener cannot be collected by GC.

Add in your Dispose method:
EventRaiseInstance.SomeEvent -= EventRaiseInstanceOnSomeEvent;


请参阅 https://msdn.microsoft.com/en -us / library / system.gc.gettotalmemory(v = vs.110).aspx [ ^ ]。


这篇关于为什么在以下C#代码的for循环中内存分配继续增加?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆