Утечка памяти происходит не на каждой машине, но надежно на паре на моей работе, и в полевых условиях она составляет около 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");
При чтении или записи в этот объект у меня есть операторы catch для Исключений Сокетов и Исключений Удаленного взаимодействия, которые затем вызывают этот же оператор.
На большинстве машин это работает без утечки памяти, но на некоторых оно протекает очень быстро. Все машины на работе имеют .NET 3.5, некоторые XP, пара Vista. Проблема была замечена только на машинах XP, и все машины на местах - XP.
Любые идеи, где я должен искать, и в качестве второстепенного вопроса, должен ли я использовать что-то совершенно отличное от этого?