.net - как связать службу Windows с приложением systray - PullRequest
1 голос
/ 20 мая 2010

У меня есть служба Windows, которая периодически что-то делает. под учетной записью пользователя запускается приложение systray (написанное на C #), которое взаимодействует со службой Windows (через удаленное взаимодействие .net) и показывает статус и некоторые опции пользователям.

Все работает хорошо, если приложение systray использует 20-30 МБ ОЗУ! он должен работать в терминальной среде, когда 50 пользователей входят в систему, только приложения systray занимают> 1 ГБ ОЗУ! и мне не нужно добавлять, это неправильно:)

Можно ли написать приложение .net systray, которое будет небольшим? (1-2 МБ максимум?) или я должен написать это на с / с ++? Тогда какой тип связи я должен использовать между службой Windows (написанной на C #) и приложением systray?

Ответы [ 8 ]

2 голосов
/ 09 июня 2010

Я добавил следующую строку в мой код (приложение вызывает ее иногда вместе с GC.Collect ())

System.Diagnostics.Process.GetCurrentProcess().MaxWorkingSet =
                System.Diagnostics.Process.GetCurrentProcess().MinWorkingSet;

Использование памяти уменьшилось до ~ 2 МБ (с 15-25 МБ), после обнуления некоторых объектов после использования (меню и значок чертежа) использование памяти сократилось до ~ 540 КБ! он немного увеличивается (до ~ 2-3МБ, если я использую контекстное меню, но затем уменьшается до ~ 540КБ)

Итак, цель достигнута:)

2 голосов
/ 20 мая 2010

Другое соображение заключается в том, что большая часть памяти, используемая приложениями .NET, находится в общих (.NET) dll и не будет дублироваться при запуске нескольких экземпляров (если ОС не использует случайные адреса загрузки dll).

Вы также можете уменьшить объем памяти, используемой JIT-компиляцией, установив ваши сборки в GAC и предварительно установив их в JIT, используя ngen. Опять же, это приведет к уменьшению использования памяти , если ОС не рандомизирует адреса загрузки DLL.

1 голос
/ 20 мая 2010

Скорее всего, проблемы с использованием памяти, которые вы испытываете, связаны с вашим приложением, а не со всеми приложениями sys-tray, созданными в .NET.

Вы должны профилировать свое приложение, чтобы определить, где происходит большое использование памяти.

0 голосов
/ 21 мая 2010

Если все, что вам нужно, это изменить значки в systray, изменить всплывающую подсказку и показать маленькое контекстное меню , непременно напишите ваше приложение systray на C / C ++, используя чистый WinAPI, и используйте режим сообщений с именем pipe общаться с сервисом. Не забудьте использовать префикс Global\ имя канала, чтобы позволить приложениям systray, работающим в нескольких сеансах, подключаться к одной и той же службе.

0 голосов
/ 21 мая 2010

Выпуск WCF (.NET 3.0 или 3.5?) Сделал удаленное взаимодействие .NET устаревшим. С WCF у вас есть возможность разместить сервер WCF в вашей службе Windows, а затем общаться с вашей службой через TCP / IP. По моему опыту, WCF гораздо более стабилен, чем удаленное взаимодействие .NET.

В зависимости от ваших потребностей вы можете рассмотреть возможность использования ServiceController вместо удаленного доступа или WCF. С помощью ServiceController вы можете запускать и останавливать службы, а также отправлять команды, определенные приложением (в виде целых чисел), с помощью Service.Controller.ExecuteCommand. Использование ServiceController намного проще, чем удаленное взаимодействие и WCF, но не так гибко.

0 голосов
/ 21 мая 2010

Мы сталкивались с подобной проблемой в прошлом, и я поделюсь с вами своим решением.

.Net framework. Библиотека TCP / IP жалко не работает и пожирает память, как и все.

В качестве решения этой проблемы мы выбрали библиотеку XF от KODART - высокопроизводительную библиотеку TCP / IP с открытым исходным кодом для приложений .Net . Он отлично масштабируется на нескольких клиентских подключениях.

Вы можете установить каналы TCP / IP, используя библиотеку XF, и самостоятельно наблюдать за результатами.

Оформить заказ эту статью для получения дополнительной информации.

0 голосов
/ 21 мая 2010

Итак, если я решу написать приложение systray на c / c ++ какой тип связи я должен использовать между службой Windows (написанной на C #) и приложением systray?

0 голосов
/ 20 мая 2010

Возможно, ваше приложение sys-tray имеет утечки памяти. Хороший инструмент профилирования поможет вам понять, что происходит.

...