订阅静态方法内的事件

问题描述 投票:0回答:1

我正在寻求一些关于以下订阅事件的方式是否会导致内存泄漏的建议:

// Possibly in an UI class...
void Main()
{
    var myObject = Helpers.GetMyObject();
    myObject.DoWork();
}

public class MyObject
{
    public event EventHandler WorkDone;

    public void DoWork()
    {
        WorkDone?.Invoke(this, new EventArgs());
    }
}

public static class Helpers
{
    public static MyObject GetMyObject()
    {
        var myObject = new MyObject();
        myObject.WorkDone += (o, i) => Console.WriteLine("Did some work!");

        return myObject;
    }
}

谢谢你。

c# events event-handling
1个回答
0
投票

如果出现以下情况,可能会发生内存泄漏:

  1. MyObject 实例在不再需要时未得到正确处置。如果频繁创建 MyObject 实例并且未正确处置,它们可能会在内存中累积,从而导致内存泄漏。

  2. 事件处理程序 myObject.WorkDone += (o, i) => Console.WriteLine("做了一些工作!");捕获对比 MyObject 实例本身寿命更长的外部对象或资源的引用。这可以防止 MyObject 实例被垃圾回收,即使不再需要它也是如此。

为了减轻潜在的内存泄漏:

  1. 确保 MyObject 实例在不再需要时得到正确处置。如果 MyObject 实现了 IDisposable,请确保在适当的情况下调用 Dispose() 或使用 using 块。

  2. 除非必要,否则避免在事件处理程序中捕获对外部对象或资源的引用。如果您确实捕获外部引用,请确保在不再需要外部对象或资源时取消订阅该事件,以防止不必要地保留 MyObject 实例。
© www.soinside.com 2019 - 2024. All rights reserved.