На самом деле я работаю над программным обеспечением на базе GTK # 2.12, у нас есть некоторые утечки памяти, и я ищу, как это улучшить.
Я сделал небольшое приложение, чтобы проверить правильный способ избавления от виджета.Я создаю 10 000 ярлыков, а затем удаляю их.
Вот мой класс Label:
namespace test_gtk_objects
{
public class TimeLabel : Label
{
private bool disposed = false;
protected DateTime _time;
public TimeLabel(DateTime time)
{
Time = time;
}
~TimeLabel()
{
Dispose(false);
Console.WriteLine("Called dispose(false) of class" + this.ToString());
GC.SuppressFinalize(this);
}
//dispose
public override void Dispose()
{
// Console.WriteLine("Called dispose(true) of class" + this.ToString());
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposed)
return;
if (disposing)
{
Hide();
Unrealize();
Unparent();
Unmap();
Destroy();
Unref();
Console.WriteLine("ref: " + RefCount.ToString());
// Free any other managed objects here.
//
}
disposed = true;
base.Dispose();
}
protected void display(Label input_label)
{
input_label.Text = _time.ToString("HH:mm:ss");
}
internal DateTime Time
{
get { return _time; }
set
{
if (_time != value)
{
_time = value;
display(this);
}
}
}
}
}
, как вы можете видеть, я переопределил метод dispose, как было предложено.Я также попытался каким-то образом освободить большую часть виджета (особенно с помощью unref ()), чтобы убедиться, что виджет не связан с чем-то другим.
В моем главном окне я просто создаю эти ярлыки в спискеи удалите их, вызвав метод Dispose для каждого из них.Кажется, все мои виджеты удалены, но у меня всегда есть Glib.toggleref , Glib.Сигнал , как вы можете видеть на моем снимке памяти:
Снимок памяти
Я не представляю, как мне от него избавиться, если выможет помочь мне с этой проблемой, он будет очень признателен
Дэвид