Я использую следующий код. Как я увидел это в профиле профилей .Net, я обнаружил, что утечки памяти происходят.Как освободить память, используемую новым классом, чтобы избежать утечки памяти?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Forms;
using System.ComponentModel;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace TestMemLeak
{
public partial class MainWindow : Window
{
public int count = 0;
BackgroundWorker worker = new BackgroundWorker();
public class test
{
public int sno{get; set;}
public string col1 { get; set; }
public string col2 { get; set; }
public string col3 { get; set; }
public string col4 { get; set; }
public string col5 { get; set; }
public string col6 { get; set; }
public string col7 { get; set; }
}
// test test1 = new test();
public MainWindow()
{
InitializeComponent();
worker.WorkerReportsProgress = true; // For Background Worker
worker.DoWork += worker_DoWork;
worker.ProgressChanged += worker_ProgressChanged;
worker.WorkerSupportsCancellation = true;
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
}
private void Load_Click(object sender, RoutedEventArgs e)
{
dg1.Items.Clear();
worker.RunWorkerAsync();
}
void worker_DoWork(object sender, DoWorkEventArgs e)
{
// int max = (int)e.Argument;
for (int i = 1; ; i++)
{
(sender as BackgroundWorker).ReportProgress(i);
System.Threading.Thread.Sleep(1);
if (worker.CancellationPending)
{
e.Cancel = true;
return;
}
}
}
void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
int i = e.ProgressPercentage;
if (i > 100000)
{
count++;
if (count == 100)
{
for (int k = 0; k < 100; k++)
{ dg1.Items.RemoveAt(0); }
count = 0;
}
}
dg1.Items.Add(new test() {sno=i,col1="test",col2="test",col3="test",col4="test",col5="test",col6="test",col7="test" });
}
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
System.Windows.MessageBox.Show("Task Cancelled.....");
}
// Check to see if an error occurred in the background process.
else if (e.Error != null)
{
System.Windows.MessageBox.Show("Error while performing background operation." + e.Error.Message);
}
else
{
// Everything completed normally.
System.Windows.MessageBox.Show("Task Completed..." + e.Result);
}
}
private void Stop_Click(object sender, RoutedEventArgs e)
{
worker.CancelAsync();
}
private void Clear_Click(object sender, RoutedEventArgs e)
{
// worker.CancelAsync();
dg1.Items.Clear();
// GC.Collect();
}
}
}
Здесь каждый раз, когда я создаю новый тест класса, так что она занимать память и не освободившись от GC. как я могу избежать этого?
Вы просто добавляете и очищаете элементы в своем DataGrid, и эти операции вызваны утечками памяти? – StepUp
Можете ли вы добавить вывод своего профилировщика памяти, который показывает путь корня GC одного из просочившихся элементов? Кроме того, какова ваша процедура тестирования? Когда вы захватываете снимки? –
Вы получаете OutOfmemoryException, или вы просто смотрите на память, используемую вашим приложением? GC.Collec() t не очищает все неиспользуемые ссылки. Возможно, вам потребуется вызвать GC.Collect (2), поскольку элементы могут считаться долговечными объектами: https://msdn.microsoft.com/en-us/library/ee787088(v=vs.110).aspx – Liero