每个人都知道从未为invocationList删除的事件处理程序可能会导致C#中的内存泄漏.
我的问题是,如果我们使用Func作为回调,我们可以有内存泄漏吗? (因此只支持一个用户)
我的问题是,如果我们使用Func作为回调,我们可以有内存泄漏吗? (因此只支持一个用户)
以下面的示例(复制并粘贴到控制台应用程序中):
class Program { static void Main(string[] args) { var m = new Manager(); var c1 = new Channel(); m.Add(c1); Console.WriteLine("m = {0}",GC.GetTotalMemory(true)); Console.ReadLine(); m.Remove(c1); Console.WriteLine("m = {0}",GC.GetTotalMemory(true)); Console.ReadLine(); } } public class Manager { List<Channel> channels = new List<Channel>(); public void Add(Channel c) { channels.Add(c); c.OnTick = OnTick; c.Start(); } public void Remove(Channel c) { channels.Remove(c); //do we have a memory leak at this point? //does c1 still pointing to Manager func and cannot be GCed? c.Stop(); } private Task OnTick(int i) { Console.WriteLine(i); return Task.Fromresult(0); } } public class Channel { public Func<int,Task> OnTick; Random r = new Random(); private System.Timers.Timer aTimer; public Channel() { OnTick = i => Task.Fromresult(r.Next()); } public void Start() { aTimer = new System.Timers.Timer(1000); aTimer.Elapsed += (sender,args) => OnTick(r.Next()); // Have the timer fire repeated events (true is the default) aTimer.AutoReset = true; // Start the timer aTimer.Enabled = true; } public void Stop() { aTimer.dispose(); } }
解决方法
//do we have a memory leak at this point?
没有.在ANTS Memory Profiler上对此进行了测试以验证这一点.
//does c1 still pointing to Manager func and cannot be GCed?
Manager是订阅者,Channel是发布者.如果没有对Channel实例的引用,并且它符合条件的GC.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。