我希望有一个泛型(扩展)方法,它接受父控制并遍历其所有子控件并取消订阅它们的事件(如果有的话)。
问题 我正在密切关注内存消耗,当我创建一些基于wpf的形式,内存峰值,考虑到ui元素及其事件的数量,但是当表单关闭时,我希望内存得到释放,如在wpf中,我假设表单处理自动处理一旦关闭,所以GC应该清理并释放内存...但那就是没有发生的事情,因为我等了几分钟,并查看了诊断工具中的私有内存使用情况,这仍然是相同的。所以我想知道它没有完全处理/取消订阅事件等
答案 0 :(得分:0)
我不能说是否有许多订阅事件会对性能产生负面影响,但我当然可以回答你的其他两个问题:
您可以使用以下扩展程序枚举所有子项:
public static IEnumerable<T> GetVisualChildren<T>(this DependencyObject Parent) where T : DependencyObject
{
if (Parent != null)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(Parent); i++)
{
var Child = VisualTreeHelper.GetChild(Parent, i);
if (Child != null && Child is T)
yield return (T)Child;
foreach (var ChildOfChild in GetVisualChildren<T>(Child))
yield return ChildOfChild;
}
}
}
foreach (myControlInstance.GetVisualChildren<DependencyObject>())
{
//Unsubscribe events
}
要取消订阅该对象的所有事件,请参阅此SO文章:
How do I unsubscribe all handlers from an event for a particular class in C#?