#c# #wpf #cpu-usage #kiosk
#c# #wpf #загрузка процессора #киоск
Вопрос:
В настоящее время я создаю приложение-киоск с использованием WPF. У меня есть одно главное окно и несколько пользовательских элементов управления (страниц). После последней страницы приложение перенаправит на первую страницу, чтобы запустить весь процесс заново. Я заметил, что после трехкратного запуска полного потока приложение выйдет из строя / зависнет из-за перегрузки процессора и памяти. Однако я решаю проблему перегрузки памяти, объявляя следующее
[DllImport("KERNEL32.DLL", EntryPoint = "SetProcessWorkingSetSize", SetLastError = true, CallingConvention = CallingConvention.StdCall)]
internal static extern bool SetProcessWorkingSetSize(IntPtr pProcess, int dwMinimumWorkingSetSize, int dwMaximumWorkingSetSize);
[DllImport("KERNEL32.DLL", EntryPoint = "GetCurrentProcess", SetLastError = true, CallingConvention = CallingConvention.StdCall)]
internal static extern IntPtr GetCurrentProcess();
и добавление этого кода в событие Unloaded().
IntPtr pHandle = GetCurrentProcess();
SetProcessWorkingSetSize(pHandle, -1, -1);
Этот код способен решить проблему перегрузки памяти, но проблема перегрузки процессора все еще существует. Кто-нибудь, пожалуйста, может мне с этим помочь, пожалуйста? Что мне добавить в событие Unloaded (), чтобы освободить процессор?
Комментарии:
1. Какой тип задач вы запускаете в приложении? Можете ли вы сделать меньше работы, уменьшить вызовы таймера или что-нибудь связанное?
2. Вам необходимо предоставить более подробную информацию. Какую интенсивную работу с процессором вы выполняете и как? Какую работу с интенсивным использованием памяти вы выполняете и как? Не забывайте освобождать неуправляемые ресурсы после выхода с каждой страницы, реализуя шаблон Dispose. Каждый
IDisposable
должен быть удален. Альтернативно повторно использовать созданные ресурсы. Проверьте свое приложение на наличие утечек памяти. Привязка данных без реализацииINotifyPropertyChanged
и события без подписки являются печально известными кандидатами на создание утечек памяти. Без подробностей помощь невозможна. Очевидно, у вас где-то есть какой-то вонючий код.3. я использую фоновый рабочий и таймер почти на каждой странице. но я закрываю каждый раз
4. Таймеры и рабочие группы brackground являются хорошими источниками памяти и справляются с утечками.
5. Добро пожаловать в асинхронное программирование .
BackgroundWorker
это древний унаследованный класс.Timer
не требуется в 99% сценариев, если вы знакомы сasync/await
. Надеюсь, вы не в Framework 3.5 и Windows XP.