我有這個代碼,無論我做什么,我都會從 DataGrid 資料更新中得到記憶體泄漏。幾天來,我一直在這里查看有關此問題的所有其他答案,但沒有找到任何對我有用的方法。我有一個 WPF 視窗和此代碼來更新資料(它是實際代碼中發生的事情的一個小版本,但我遇到了相同的錯誤)。
我有這個 WPF 代碼:
<Window x:Class="TremendoMemoryLeak.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:TremendoMemoryLeak"
mc:Ignorable="d"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
Title="MainWindow" Height="450" Width="800">
<Grid>
<DataGrid ItemsSource="{Binding Hmis, Mode=OneWay}" AutoGenerateColumns="False" IsReadOnly="True">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Estado">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Ellipse Fill="{Binding Estado}" HorizontalAlignment="Left" Height="25" Stroke="Black" VerticalAlignment="Top" Width="25"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Dato1" Binding="{Binding Dato1}"/>
<DataGridTextColumn Header="Dato2" Binding="{Binding Dato2}"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
這個類代碼:
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window, INotifyPropertyChanged
{
public ObservableCollection<Datos> Hmis { get; } = new ObservableCollection<Datos>();
private System.Threading.Timer timer;
public MainWindow()
{
InitializeComponent();
timer = new System.Threading.Timer(ActualizacionUI_Tick, null, 1000, 1000);
}
public event PropertyChangedEventHandler? PropertyChanged;
private void ActualizacionUI_Tick(object data)
{
Datos dato1 = new Datos() { Dato1 = "1", Dato2 = "2" };
Datos dato2 = new Datos() { Dato1 = "1", Dato2 = "2" };
Datos dato3 = new Datos() { Dato1 = "1", Dato2 = "2" };
Dispatcher.Invoke(() =>
{
dato1.Estado = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FF5DC75D"));
dato2.Estado = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FF5DC75D"));
dato3.Estado = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FF5DC75D"));
Hmis.Clear();
Hmis.Add(dato1);
Hmis.Add(dato2);
Hmis.Add(dato3);
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Hmis"));
});
}
}
這個資料類:
public class Datos : INotifyPropertyChanged
{
public Brush Estado { get; set; }
public string Dato1 { get; set; }
public string Dato2 { get; set; }
public event PropertyChangedEventHandler? PropertyChanged;
}
uj5u.com熱心網友回復:
我在 Visual Studio 2022 上執行解決方案,在 VS2019 上測驗時,記憶體泄漏突然消失了,所以這似乎是 2022 預覽版中的問題。
uj5u.com熱心網友回復:
我將計時器周期更改為 50 毫秒,并在除錯中運行程式 8000 萬次(約 100 000 次呼叫ActualizacionUI_Tick),記憶體使用量穩定,大約為 123 mb。
當您啟動應用程式時,確實有一段時間記憶體使用量增加(然后穩定)。使用JetBrains公司dotMemory看來,幸存物件與ConditionalWeakTable執行和保留MS.Internal.WeakEventTable其清理后曾經在一段時間對一些內部啟發式的意愿。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/327283.html
