Я играю с функциями удаленного взаимодействия .net, и есть кое-что, что я не могу ни понять, ни найти ответ в Google, а именно то, как работает удаление объектов.
Я пытаюсь реализовать какой-то пул объектов с удаленным взаимодействием, для этого у меня есть список статических объектов, которые в основном являются строкой и индикатором логического состояния.
Когда я запрашиваю новый удаленный объект (во время конструктора), я проверяю пул на наличие свободного, помечаю его как используемый и во время разрушения объекта. объект DismisObject просто помечает его как «бесплатный»,
public class MyRemotableObject : MarshalByRefObject,IDisposable
{
private AdvancedString obj;
public MyRemotableObject()
{
aso = strCache.GetFreeObject();
}
~MyRemotableObject()
{
Destroy();
}
public void Dispose()
{
Destroy();
}
public void SetMessage(string message)
{
if (obj== null) { obj= strCache.GetFreeObject(); }
obj.str= message;
}
public string GetMessage()
{
return obj.str;
}
void Destroy()
{
if (obj!= null)
{
obj.DismisObject();
obj = null;
}
}
}
Таймауты работают нормально - после 5 минут текущей активности, когда я пытаюсь использовать объект, я получил исключение удаленного взаимодействия, но функции ~ MyRemotableObject (), а не Dispose () не вызываются, поэтому объект никогда не помечается как свободный в пуле. Даже если я закрою программу - все равно объект останется активным в пуле. Единственный способ освободить его - это вручную вызвать функцию Dispose (чего я не могу сделать, если, например, программа вылетает или пользователь уходит, открыта)
Есть ли способ заставить .net уничтожать / уничтожать объекты при закрытии соединения? (Я обнаружил в каком-то месте, что CG должен делать это время от времени, поэтому я открыл 4 клиента и разбил 2 из них - другие 2 отключились через некоторое время, но объекты все еще помечены как активные)