Байт частной памяти растет в приложении C#
Привет,
Я создал приложение для отслеживания текущего активного окна на экране. Я использую таймер и подписываюсь на его прошедшее событие, чтобы он мог обработать мой код. Я установил интервал таймера на 2 секунды.
Когда я запускаю это приложение, я вижу увеличение значения частных байтов (отраженное в TaskManager), и оно продолжает увеличиваться.
После просмотра видео на youtube я попытался установить все возможные объекты в Null для правильного удаления, а также установить используемый оператор "Using" для восстановления памяти из собственных объектов.
class myservice { public void Start() { Timer tActiveWin = new Timer(); tActiveWin.Interval = TimeSpan.FromSeconds(2).TotalMilliseconds; tActiveWin.Elapsed += TActiveWin_Elapsed; tActiveWin.AutoReset = true; tActiveWin.Enabled = true; } private void TActiveWin_Elapsed(object sender, ElapsedEventArgs e) { var win = new WindowEvents().GetActiveWindow(); Console.WriteLine(win.activewindowtitle); } } class WindowEvents { [DllImport("user32.dll")] static extern IntPtr GetForegroundWindow(); [DllImport("user32.dll")] static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count); [DllImport("user32.dll", SetLastError = true)] static extern int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId); public JsonAppEvents.Activewindow GetActiveWindow() { Task<JsonAppEvents.Activewindow> activeWindow = Task.Factory.StartNew(() => { JsonAppEvents.Activewindow activeWin = new JsonAppEvents.Activewindow(); IntPtr hWnd = GetForegroundWindow(); int processID = 0; int threadID = GetWindowThreadProcessId(hWnd, out processID); using (Process p = Process.GetProcessById(processID)) { StringBuilder text = new StringBuilder(256); if (GetWindowText(hWnd, text, 256) > 0) { text.ToString(); } activeWin.activewindowfullpath = p.MainModule.FileName; activeWin.activewindowtitle = p.MainWindowTitle; activeWin.time = p.StartTime.ToString("ddd, dd MMM yyyy HH:mm:ss"); activeWin.activewindowdescription = p.MainModule.ModuleName; p.Dispose(); hWnd = IntPtr.Zero; processID = 0; threadID = 0; text.Clear(); text = null; return activeWin; } }); return activeWindow.Result; } } class JsonAppEvents { public class Activewindow { public string activewindowfullpath { get; set; } public string activewindowdescription { get; set; } public string time { get; set; } public string activewindowtitle { get; set; } } }
После запуска программы я захватил частные байты следующим образом :
Время PrivateBytes
-----------------------
5300 К 8: 45 ВЕЧЕРА
5800 К 8: 46 ВЕЧЕРА
7,252 K 8: 47 ВЕЧЕРА
7,260 K 8: 49 ВЕЧЕРА
------------------------------
Я ищу какую-то помощь по этому поводу, чтобы стабилизировать частные байты от увеличения и правильно проследить, почему это происходит? что-то не так с моим кодом?
Что я уже пробовал:
- Поиск в интернете объекта утилизации
- Я попытался установить все возможные объекты в Null для правильного удаления, а также установить used.
Richard Deeming
Я хотел бы начать путем удаления Task.Factory.StartNew
в GetActiveWindow
метод. Вы запускаете новую задачу в фоновом потоке только для того, чтобы заблокировать текущий поток и дождаться его завершения. Вместо этого просто выполняйте работу над текущим потоком.
Вы также можете избавиться от вызова GetWindowText
и связанные с этим StringBuilder
, так как вы никогда не используете возвращаемое значение.
И вам не нужно явно вызывать Dispose
на объекте, который завернут в using
блок.
Bernhard Hiller
Диспетчер задач Windows не является хорошим инструментом для обнаружения и анализа утечек памяти. Ваше заявление может быть ложноположительным.