0

Ich erstelle einfach eine Observable-Sammlung im Hintergrund und bin daran gebunden.Binden von WPF DataGrid ItemsSource erstellt Speicherleck

Alle Objekte erben von INotifyPropertyChanged. aber trotzdem steigt der Speicherverbrauch ständig an.

folgende Objekte Instanzen kontinuierlich erhöht werden

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                      

Ich verwende .net 4.5.2.

Siehe auch die folgenden Screenshots:

<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> 

-Code hinter:

MemoryConsumptionOverview

ClassesIncreasing

den Beispielcode

XAML Markup Beigefügt

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; 

    } 

} 

Antwort

0

Es wird von DispatcherTimer verursacht.

Ein DispatcherTimer hält ein Objekt am Leben, wenn die Methoden des Objekts an den Timer gebunden sind. https://msdn.microsoft.com/ru-ru/library/system.windows.threading.dispatchertimer(v=vs.110).aspx

Verwenden Sie stattdessen System.Timers.Timer und Dispatcher.

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(); 
     }); 

    } 
+0

Vielen Dank! Das hat das Problem gelöst! – Seppl

Verwandte Themen