我需要对这种情况的最佳实践提出一些建议。我搜索但没有找到任何令人满意的答案。
我们在winforms项目中使用第三方(.net)DLL。它引发了一些事件,我们订阅了。问题是,我是否需要在班上明确取消订阅这些活动?
BTW我们都使用.net框架4.感谢您的建议。
一些示例代码......
public class MyClientCode: IDisposable
{
private readonly 3rdParty.TheirClass _theirClass;
public MyClientCode()
{
_theirClass = new _theirClass()
_theirClass.ReadData += ReadDataEvent;
}
public void SomeOtherMethod()
{
//some other code
}
public void ReadDataEvent()
{
//some code
}
public void Dispose()
{
_theirClass.ReadData -= ReadDataEvent;
}
}
并在按钮点击事件中,我做...
MyClientCode code = new MyClientCode();
code.SomeOtherMethod();
答案 0 :(得分:4)
如果您没有取消订阅,订阅该活动的对象将不会被垃圾回收(它将被保存在内存中)。这可能会造成内存泄漏并导致内存使用过多。
但是,如果事件的生命周期与包含它的类相比更短或相同,在您的情况下,将正确收集内存。如果您有另一个对象引用非私有事件,那么您将遇到问题。
请参阅MSDN:
在取消订阅事件之前,发布对象中作为事件基础的多播委托具有对封装订阅者事件处理程序的委托的引用。 只要发布对象包含该引用,您的订阅者对象就不会被垃圾回收。
请注意,如果您要退出申请,则不需要取消订阅,只有在不应将其保留在内存中的情况下才需要取消订阅。 (例如,当您关闭应用程序中的窗口时,您应该取消订阅任何事件,否则窗口仍将保留在内存中。)如果手动销毁包含对象,则事件将也被摧毁了。