Это - один из тех случаев, где суррогатный ключ в значительной степени всегда имеет смысл. Существуют случаи, где Вы или выбираете то, что является лучшим для базы данных или что является лучшим для Вашей объектной модели, но в обоих случаях, с помощью бессмысленного ключа или GUID лучшая идея. Это делает индексацию легче и быстрее, и это - идентификационные данные для Вашего объекта, который не изменяется.
Разве там, где ваша служба создает экземпляр объекта,
serviceConfigRemote = new serviceConfigDataRemote();
не должно выглядеть как
serviceConfigRemote = serviceConfigDataRemote.Instance;
?
]По крайней мере, Таким образом, вы создаете два разных экземпляра на стороне сервера: один в статическом инициализаторе члена instance
, который будет использоваться свойством Instance
, а другой - через свойство новая явная конструкция serviceConfigDataRemote ()
. Вам также может пригодиться добавление частного конструктора к этому классу, чтобы ничто другое не могло создать экземпляр синглтона, кроме статического инициализатора.
Это может быть не решением проблемы постоянно увеличивающейся памяти, но определенно кажется чем-то проблемы, которую необходимо решить.
РЕДАКТИРОВАТЬ:
Вот еще пара советов, которые я нашел при поиске в сетях:
[MTAThread]
к основному методу службы хоста. RemotingServices.Disconnect (this.serviceConfigRemote);
, когда вы закрываете службу хоста. Вы пробовали использовать отложенное создание экземпляров на своем синглтоне? Возможно, ему не нравится способ его создания.
public sealed class serviceConfigDataRemote : MarshalByRefObject { private bool myConnectedFlag; private bool mySendingFlag; private bool myUpdateFlag; private string myClientConfiguration; static serviceConfigDataRemote instance; static serviceConfigDataRemote() { } public serviceConfigDataRemote() { myConnectedFlag = false; mySendingFlag = false; myUpdateFlag = false; myClientConfiguration = ""; } public static serviceConfigDataRemote Instance { get { if (instance == null) { lock (new Object()) { if (instance == null) { instance = new serviceConfigDataRemote(); } return instance; } } 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; } } }
Поскольку единственная ОС, в которой вы видите эту ошибку, - это XP, существует несколько возможных проблем.
XP имеет ограничение на входящее соединение 10 (на Pro) или 5 (на домашнем компьютере). ), и это может сыграть свою роль в проблеме.
Убедитесь, что установлены все пакеты обновления / исправления. Я знаю, что это может быть банальным и банальным ответом на любые проблемы, но тот факт, что эта проблема появляется только в XP, подразумевает, что она связана с ОС.
Кроме того, не знаю, как вы используете службу, но Windows XP - это настольный компьютер. ОС, а не серверная ОС. Если вы хотите, чтобы служба была сервером какого-либо типа, вам действительно следует использовать 2000/2003/2008 и т. Д., Тем более что у нее есть проблемы только с XP.