【发布时间】:2019-06-02 00:41:46
【问题描述】:
我正在尝试了解 WPF 内存泄漏,在阅读了该主题后,我有一些不清楚的地方。
问题最好来源于例子,所以我们来定义:
型号:
public class Mom : INotifyPropertyChanged
{
public ObservableCollection<Kid> Kids { get; set; }
private string name;
public string Name
{
get => name;
set => Set(ref name, value);
}
public event PropertyChangedEventHandler PropertyChanged;
protected void Set<T>(ref T field, T newValue = default(T), [CallerMemberName] string propertyName = null)
{
field = newValue;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
ViewModel (DataContext) 可能如下所示:
public class MomViewModel, INotifyPropertyChanged
{
private Mom selected;
public Mom Selected
{
get => selected;
set => Set(ref selected, value);
}
}
现在我想问一下关于 XAML 中这两种绑定方案的问题:
第一次绑定:
<ListView ItemsSource="{Binding Selected.Kids}">
...
</ListView >
第二次绑定:
<TextBlock Text="{Binding Selected.Kids.Count}" />
现在想象一下,在 ViewModel 中,我们有一个计时器,它每秒分配一个新的妈妈。那是Selected = new Mom { .. };。
第一季度: 绑定 1 会产生内存泄漏吗?属性是 ObservableCollection 类型,它实现了 INotifyPropertyChanged,但属性本身没有(只是常规的 get、set)。
第二季度:
绑定 2 会产生内存泄漏吗?绑定直接针对来自 Collection 且未实现 INotifyPropertyChanged 的 Count。
请注意,视图 (XML) 本身永远不会被破坏 - 只有“Selected”属性每秒更改一次。我(也)不清楚 WPF 何时允许垃圾收集 - 仅当视图被销毁或绑定更改时。我的测试在这里没有定论...
谢谢。
【问题讨论】:
-
你测试的时候发生了什么?
-
GC 确实启动了,但内存没有释放。
-
@mjwills 查看 VS 2017 中的标准分析器。上面的示例是我测试的一个非常简单的设置。所以我得出的结论是,在我尝试缩小 VS 中的内存使用量(我没有太多经验)之前,我需要了解上述 2 个绑定应该发生什么,
标签: c# wpf data-binding memory-leaks