【发布时间】:2014-07-28 22:27:25
【问题描述】:
我正在开发一个自定义控件,它在内部订阅 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
- Weak Events。很好,但是许多实现不适合 WinRT/Silverlight,或者,它们需要显式取消注册,或者,它们仅在事件被调用时才取消注册(Duh!它是一个弱事件)!
- 终结器。如果有像事件处理程序这样的 GC 根,Finalizer 不会被阻止吗?
【问题讨论】:
-
你能确定是什么具体情况导致
Unloaded事件没有被引发吗?
标签: c# wpf events memory-leaks windows-runtime