每台机器上都没有发生内存泄漏,但在我工作的情况下,一对夫妇的内存泄漏可靠,而且现场看起来接近10%。
我有一个产品,它使用Windows服务来监控用户输入以启动警报,与仅用于放置在系统托盘中的可视应用程序配对,并允许用户进行配置更改。
我选择使用远程对象来共享两个进程之间的配置信息。在服务中,它被称为serviceConfig,在可视化应用程序中,它被称为configData。首先在服务器上创建对象,然后按如下方式进行远程处理:
try
{
InitializeComponent();
setAppInitDLL(thisDirectory);
serviceConfig = new serviceConfigData();
Regex getVersion = new Regex("Version=(?<ver>[^,]*)");
if (getVersion.IsMatch(Assembly.GetExecutingAssembly().FullName))
{
serviceConfig.Version = new Version(getVersion.Match(Assembly.GetExecutingAssembly().FullName).Result("${ver}").ToString());
}
// Create the server channel for remoting serviceConfig.
serverChannel = new TcpServerChannel(9090);
ChannelServices.RegisterChannel(serverChannel, false);
RemotingServices.Marshal(this.serviceConfig, "ServiceConfigData");
baseLease = (ILease)RemotingServices.GetLifetimeService(serviceConfig);
lock (Logger) { Logger.Write(String.Format("The name of the channel is {0}", serverChannel.ChannelName)); }
lock (Logger) { Logger.Write("Exiting Constructor"); }
}
catch (Exception ex)
{
lock (Logger) { Logger.Write(String.Format("Error in Constructor:{0}", ex.Message)); }
}
然后在可视化应用程序中,我有一个使用以下连接的私有对象:
configData = (serviceConfigData)Activator.GetObject(typeof(serviceConfigData), "tcp://localhost:9090/ServiceConfigData");
当读取或写入此对象时,我会捕获Socket Exceptions和Remoting Exceptions的语句,然后调用同样的语句。
在大多数机器上,这可以在不泄漏内存的情况下工作,但在某些机器上它会很快泄漏。所有正在运行的机器都有.NET 3.5,有些是XP,有些是Vista。这个问题只出现在XP机器上,现场的机器都是XP。
我应该关注的任何想法,作为次要问题,我应该使用与此完全不同的东西吗?
答案 0 :(得分:0)
我的第一个想法是用Red Gate's Memory Profiler之类的东西在你看到漏洞的机器上分析应用程序。
比试图猜测泄漏可能会更加可靠。
至于选择合适的技术,如果您的所有计算机都安装了.NET 3.5,您可能需要考虑迁移到WCF(主要是命名管道)以进行进程间通信。查看this SO post了解更多详情...