C# ile Ram Temizleyici

C#

Yazdığımız programlar sistem üzerinde çalışırken belirli bir süre sonunda Ram tüketimleri 25-30 MB düzeyine çıkar ve hatta daha da artar.

Sonrasında ise sistem yavaşlamaları veya yazılım hataları ortaya çıkar.

Bu hatalar özellikle Timer nesnesi ile kontrol edilen form yapılarında sıkça görülmektedir. Timer_Tick her tetiklendiğinde bellek bir miktar daha artar…

Peki bu durumda ne yapmamız gerekir?

Yapılması gereken son derece basit. Aşağıdaki kod bloğunu bir class içinde projenize ekleyin

Gereken eklemeyi yaparken lütfen namespace ismini kendi projenize uygun olarak güncellemeyi unutmayın 🙂

using System;
using System.Runtime.InteropServices;

namespace ProjeAdimiz
{
    public class Memory
    {
        [DllImportAttribute("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize", ExactSpelling = true, CharSet = CharSet.Ansi, SetLastError = true)]

        private static extern int SetProcessWorkingSetSize(IntPtr process, int minimumWorkingSetSize, int maximumWorkingSetSize);

        public static void FlushMemory()
        {

            GC.Collect();

            GC.WaitForPendingFinalizers();

            if (Environment.OSVersion.Platform == PlatformID.Win32NT)
            {

                SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);

            }

        }
    }
}

Daha sonra da projenizin asıl yürütüldüğü kısımda işlem sonunda Memory.FlushMemory(); komutu ile belleği temizleyin

Örnek:

private void timer1_Tick(object sender, EventArgs e)
        {

            timer1.Enabled = false;
            this.Icon = Properties.Resources.red;
            this.Text = @"Zamanlayıcı Kapalı";
            CheckDecisions();
            Memory.FlushMemory();
            timer1.Enabled = true;
            this.Icon = Properties.Resources.green;
            this.Text = @"Zamanlayıcı Açık";
        }