我有一个定期执行某项操作的Windows服务。 在用户帐户上运行与Windows服务(通过.net远程处理)通信的系统托盘应用程序(用C#编写),并向用户显示状态和一些选项。
除了systray应用程序使用20-30MB的RAM之外,一切正常! 它必须在终端环境中工作,当50个用户登录时,只有系统托盘应用程序需要> 1GB的RAM!我不必添加,这是错误的:)
是否可以编写小型的.net系统应用程序? (最大1-2MB?) 或者我应该用c / c ++编写它?那么,我应该在Windows服务(用C#编写)和systray应用程序之间进行什么样的通信?
答案 0 :(得分:2)
另一个考虑因素是.NET应用程序消耗的大量内存位于共享(.NET)dll中,并且在运行多个实例时不会复制(除非操作系统使用随机化的dll加载地址)。
您还可以通过将程序集安装到GAC并使用ngen
预先对其进行JIT来减少JIT编译所使用的内存。同样,这将导致内存使用量减少,除非 OS随机化dll加载地址。
答案 1 :(得分:2)
我在代码中添加了以下行(应用程序有时会将其与GC.Collect()一起调用)
System.Diagnostics.Process.GetCurrentProcess().MaxWorkingSet =
System.Diagnostics.Process.GetCurrentProcess().MinWorkingSet;
内存使用量下降到~2MB(从15-25MB),在使用后将某些对象归零(绘图菜单和图标)后,内存使用量降至~540KB! 它增长了一点(如果我使用上下文菜单,大约2-3MB,但它会回落到~540KB)
所以,实现了目标:)
答案 2 :(得分:1)
您遇到的内存使用问题很可能是您的应用程序特有的,而不是所有使用.NET构建的系统托盘应用程序。
您应该对应用程序进行概要分析,以确定发生大量内存的情况。
答案 3 :(得分:0)
您的sys-tray应用程序可能存在内存泄漏。一个好的分析工具可以帮助您了解正在发生的事情。
答案 4 :(得分:0)
所以,如果我决定用c / c ++编写systray应用程序 我应该在Windows服务(用C#编写)和systray app之间使用什么样的通信?
答案 5 :(得分:0)
我们过去遇到过类似的问题,我会和你分享我的解决方案。
.Net框架TCP / IP库在性能上表现不佳,并且像任何东西一样耗尽内存。
作为解决方案,我们选择 XF library from KODART用于.Net 应用程序的开源高性能TCP / IP库。它在多个客户端连接上进行了惊人的扩展。
您可以使用XF库建立TCP / IP通道并自己观察结果。
结帐this article了解更多信息。
答案 6 :(得分:0)
WCF(.NET 3.0或3.5?)的发布使.NET远程处理过时了。使用WCF,您可以选择在Windows服务中托管WCF服务器,然后通过TCP / IP与您的服务进行通信。根据我的经验,WCF比.NET远程处理稳定得多。
根据您的需要,您可能需要考虑使用ServiceController
而不是远程处理或WCF。使用ServiceController
,您可以启动和停止服务,还可以使用Service.Controller.ExecuteCommand
将应用程序定义的命令(作为整数)发送到您的服务。使用ServiceController
比远程处理和WCF简单得多,但不够灵活。
答案 7 :(得分:0)
如果您需要的是更改系统托盘中的图标,更改工具提示并显示小上下文菜单,请务必使用裸WinAPI在C / C ++中编写系统托盘应用程序,并使用名为的消息模式管道与服务进行通信。不要忘记使用Global\
管道名称前缀来允许在多个会话中运行的系统托盘应用程序连接到同一服务。