我正在开发一个自定义控件,它内部订阅了Touch.FrameReported - 一个静态事件。这可能会导致内存泄漏(在某些情况下确实会出现)。
这是我的当前解决方案。在Loaded / Unloaded事件中订阅/取消订阅。然而,我发现Unloaded事件并不总是被调用。这可能会导致内存泄漏。
// Imagine this is a CustomControl, to be consumed by users
// with no regard for calling Dispose
public class CustomGrid : Grid
{
public CustomGrid()
{
Loaded += (s, a) =>
{
Touch.FrameReported -= OnTouchFrameReported;
Touch.FrameReported += OnTouchFrameReported;
};
Unloaded += (s, a) =>
{
// The intention is to unsubscribe on unload, which should pre-date
// user intended 'disposal' of the control
Touch.FrameReported -= OnTouchFrameReported;
};
}
有没有已知的模式来解决这个问题?在自定义控件“拆除”时取消订阅事件?我已经尝试过:
- 在未加载时取消订阅。并不能总是被调用。
- Dispose。无法使用,因为用户可能不确定地调用Dispose。
- 弱事件。很好,但是许多实现不适用于WinRT / Silverlight,或者它们需要显式注销,或者它们只在事件被调用时注销(当然!这是一个弱事件)!
- 终结器。如果有类似事件处理程序的GC根,则终结器会被阻止吗?
Unloaded
事件不被触发吗? - jmcilhinney