Я использую самый простой пример удаленного взаимодействия, который я могу найти, разделяя объект между службой Windows и программой Windows Form (клиентом), работающей на той же машине.
Служба создает экземпляр объекта следующим образом:
serviceConfigRemote = new serviceConfigDataRemote();
serverChannel = new TcpServerChannel(9090);
ChannelServices.RegisterChannel(serverChannel, false);
RemotingServices.Marshal(this.serviceConfigRemote, "ServiceConfigData");
Клиент устанавливает соединение следующим образом:
TcpClientChannel channel = new TcpClientChannel();
ChannelServices.RegisterChannel(channel, false);
configData = (serviceConfigDataRemote)Activator.GetObject(typeof(serviceConfigDataRemote), "tcp://localhost:9090/ServiceConfigData");
Идея состоит в том, чтобы служба могла вносить изменения в некоторые параметры объекта, чтобы клиент мог прочитать эти изменения.
Сам объект:
public sealed class serviceConfigDataRemote : MarshalByRefObject
{
private bool myConnectedFlag;
private bool mySendingFlag;
private bool myUpdateFlag;
private string myClientConfiguration;
static readonly serviceConfigDataRemote instance = new serviceConfigDataRemote();
static serviceConfigDataRemote()
{
}
public serviceConfigDataRemote()
{
myConnectedFlag = false;
mySendingFlag = false;
myUpdateFlag = false;
myClientConfiguration = "";
}
public static serviceConfigDataRemote Instance
{
get
{
return instance;
}
}
public override object InitializeLifetimeService()
{
return (null);
}
public bool Connected
{
get { return myConnectedFlag; }
set { myConnectedFlag = value; }
}
public bool Sending
{
get { return mySendingFlag; }
set { mySendingFlag = value; }
}
public bool CheckForUpdates
{
get{return myUpdateFlag;}
set { myUpdateFlag = value; }
}
public string ClientConfiguration
{
get { return myClientConfiguration; }
set { myClientConfiguration = value; }
}
}
Пока служба работает сама по себе, использование памяти в диспетчере задач остается постоянным, даже если служба постоянно обновляет объект информацией о состоянии. Когда клиент запускается, оба начинают увеличивать использование памяти и никогда не падают.
Это проблема, о которой я говорил в Мой предыдущий вопрос о поиске утечек памяти.
Это выглядит по-разному на разных машинах, некоторые показывают отсутствие увеличения памяти, но машины, которые делают это надежно воспроизвести эту проблему. Запуск .NET Memory Profiler показывает, что в службе постоянно увеличивается число «новых экземпляров», причем только один или два «Удалено» на вкладке Типы / Ресурсы, где Пространство имен / Система - это Ядро, а Имя / Ресурс - это HeapMemory. Я все еще пытаюсь научиться использовать Memory Profiler, поэтому я прошу прощения, если это неверная информация, и я также буду благодарен за подсказку, где еще я должен искать.
Этот объект создается один раз, с помощью пары параметров для чтения и записи, без файла io, без выделения памяти, которое я вижу, и все же использование моей памяти только увеличивается, как только я начинаю соединение с клиент к этому объекту и читать его значения. Буду признателен за любые входные данные, так как я хотел бы избежать вытягивания этого кода и замены его именованными каналами или аналогичными, но я быстро подхожу к этому вопросу как к единственному варианту.