为什么在以下C#代码的for循环中内存分配继续增加? [英] Why does the memory allocation continue to increase while in the for loop in the following C# code?
本文介绍了为什么在以下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屋!
查看全文