1

我有一个定期执行某些操作的 Windows 服务。在用户帐户上运行与 Windows 服务(通过 .net 远程处理)通信的系统托盘应用程序(用 C# 编写)并向用户显示状态和一些选项。

除了系统托盘应用程序使用 20-30MB 内存之外,一切都运行良好!它必须在终端环境下工作,当 50 个用户登录时,只有系统托盘应用程序占用 >1GB 的 RAM!而且我不必添加,那是错误的:)

是否可以编写很小的 .net 系统托盘应用程序?(最大 1-2MB?)还是我应该用 c/c++ 编写它?那么,我应该在 windows 服务(用 C# 编写)和系统托盘应用程序之间使用什么样的通信?

4

8 回答 8

2

另一个考虑因素是 .NET 应用程序消耗的大量内存位于共享 (.NET) dll 中,并且在运行多个实例时不会重复(除非操作系统使用随机的 dll 加载地址)。

您还可以通过将程序集安装到 GAC 并使用ngen. 同样,除非操作系统随机化 dll 加载地址,否则这将导致内存使用量减少。

于 2010-05-20T12:10:05.870 回答
2

我在我的代码中添加了以下行(应用程序有时会与 GC.Collect() 一起调用它)

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

内存使用量下降到~2MB(从15-25MB),在使用后将一些对象(绘图菜单和图标)清空后,内存使用量下降到~540KB!它会增长一点(如果我使用上下文菜单,会增长到 ~2-3MB,但随后会下降到 ~540KB)

所以,目标实现了:)

于 2010-06-09T09:16:19.370 回答
1

您遇到的内存使用问题很可能是特定于您的应用程序的,而不是所有使用 .NET 构建的系统托盘应用程序。

您应该分析您的应用程序以确定大量内存使用发生在哪里。

于 2010-05-20T11:52:10.923 回答
0

那么,如果我决定用 c/c++ 编写系统托盘应用程序,我应该在 Windows 服务(用 C# 编写)和系统托盘应用程序之间使用什么样的通信?

于 2010-05-21T08:47:19.993 回答
0

我们过去遇到过类似的问题,我会与您分享我的解决方案。

.Net 框架 TCP/IP 库可悲地表现不佳,并且像任何东西一样消耗内存。

作为解决方案,我们选择了来自 KODART 的 XF 库,这是一个用于 .Net应用程序的开源高性能 TCP/IP 库。它可以在多个客户端连接上惊人地扩展。

您可以使用 XF 库建立 TCP/IP 通道并自己观察结果。

查看这篇文章以获取更多信息。

于 2010-05-21T08:58:20.820 回答
0

您的系统托盘应用程序可能存在内存泄漏。一个好的分析工具可以帮助您了解正在发生的事情。

于 2010-05-20T13:05:33.197 回答
0

WCF(.NET 3.0 还是 3.5?)的发布使 .NET 远程处理过时了。使用 WCF,您可以选择在 Windows 服务中托管 WCF 服务器,然后通过 TCP/IP 与您的服务进行通信。以我的经验,WCF 比 .NET 远程处理稳定得多。

根据您的需要,您可能需要考虑使用ServiceController而不是远程处理或 WCF。ServiceController您可以启动和停止服务,还可以使用Service.Controller.ExecuteCommand. 使用ServiceController比远程处理和 WCF 简单得多,但没有那么灵活。

于 2010-05-21T09:13:49.947 回答
0

如果您只需要更改系统托盘中的图标,更改工具提示并显示小上下文菜单,请务必使用裸 WinAPI 用 C/C++ 编写您的系统托盘应用程序,并使用名为管道的消息模式与服务进行通信。不要忘记使用Global\管道名称前缀来允许在多个会话中运行的系统托盘应用程序连接到同一个服务。

于 2010-05-21T09:20:40.260 回答