绑定wpf datagrid itemssource创建内存泄漏



我只是在背景中创建一个可观察的集合并与之绑定。

所有对象都从InotifyPropertychanged继承。但是尽管如此,记忆消耗仍在不断提高。

以下对象实例不断提高

WeakReference                                                                                       
FrugalObjectList<WeakEventManager+Listener>                                                         
ConditionalWeakTable<TKey, TValue>+Entry<Object, Object>[]                                        
WeakEventTable+EventKey                                                                             
ConditionalWeakTable<Object, Object>                                                              
SingleItemList<WeakEventManager+Listener>                                                           
Object                                                                                              
Int32[]                                                                                             
WeakEventManager+ListenerList<NotifyCollectionChangedEventArgs>                                     
WeakEventManager+ListenerList<PropertyChangedEventArgs>                                             
HybridDictionary                                                                                    
ListDictionary                                                                                      
ListDictionary+DictionaryNode                                                                       
WeakEventManager+ListenerList<EventArgs>                                                            
WeakEventManager+ListenerList<CurrentChangingEventArgs>                                             
CollectionRecord                                                                                    

我正在使用.net 4.5.2。

另请参见以下屏幕截图:

memory commumpovertoverview

classing indcreasing

附加了示例代码

XAML标记:

<Window x:Class="BindingDataGridTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="120" Width="200"
        DataContext="{Binding RelativeSource={RelativeSource Self}}">
    <Grid>
        <DataGrid ItemsSource="{Binding BindingVals, Mode=OneWay}" />
    </Grid>
</Window>

代码背后:

using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows.Threading;
namespace BindingDataGridTest
{
    public partial class MainWindow : INotifyPropertyChanged
    {
        public ObservableCollection<Values> BindingVals { get; set; }
        public MainWindow()
        {
            BindingVals = new ObservableCollection<Values>();
            InitializeComponent();
            DispatcherTimer myTimer = new DispatcherTimer { Interval = new TimeSpan(20) };
            myTimer.Tick += CreateVals;
            myTimer.Start();
        }
        private void CreateVals(object sender, EventArgs e)
        {
            Values myMainval = new Values
            {
                MyVal = "1V" + new Random().Next()
            };
            BindingVals.Clear();
            BindingVals.Add(myMainval);
            GC.Collect();
        }
        public event PropertyChangedEventHandler PropertyChanged;
    }
    public class Values : INotifyPropertyChanged
    {
        public string MyVal { get; set; }
        public event PropertyChangedEventHandler PropertyChanged;
    }
}

是由dispatchertimer引起的。

每当对象的方法绑定到计时器时,调度仪都会使对象保持活力。https://msdn.microsoft.com/ru-ru/library/system.windows.threading.dispatchertimer(v = vs.110(.aspx

使用system.timers.timer和调度器分别。

    public MainWindow()
    {
        BindingVals = new ObservableCollection<Values>();
        InitializeComponent();
        System.Timers.Timer myTimer = new Timer {Interval = 20};
        myTimer.Elapsed += CreateVals;
        myTimer.Start();
    }
    private void CreateVals(object sender, EventArgs e)
    {
        Dispatcher.Invoke(() =>
        {
            Values myMainval = new Values
            {
                MyVal = "1V" + new Random().Next()
            };
            BindingVals.Clear();
            BindingVals.Add(myMainval);
            GC.Collect();
        });
    }

最新更新