удаленное взаимодействие и деструкторы в c #

Я играю с функциями удаленного взаимодействия .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 отключились через некоторое время, но объекты все еще помечены как активные)


person SimSimY    schedule 06.07.2009    source источник


Ответы (2)


Вы можете использовать ITrackingHandler для отслеживать, когда ваш объект отключен, а затем запустить код Dispose в этой точке.

person Sam Saffron    schedule 06.07.2009

По возможности используйте объекты, реализующие IDisposable в конструкции using.

e.g.

using (var remotableObj = new MyRemotableObject())
{
    // use it
}

Дополнительная информация здесь и здесь.

person jpoh    schedule 06.07.2009
comment
Спасибо, но я не думаю, что могу использовать здесь using, потому что я использую объект в событиях (например, когда происходит OnTextChange, я вызываю SetMessage), а позже я хочу использовать это для возврата реального объекта (а не просто строки ) Мне нужно иметь возможность запускать некоторые команды, когда .net (принудительно) закрывает соединение с клиентом, или, по крайней мере, иметь возможность планировать GC на стороне сервера. - person SimSimY; 06.07.2009