Question

Je joue avec les fonctionnalités éloignées .NET et il y a quelque chose que je ne peux pas comprendre ni trouver une réponse dans Google et c'est comment fonctionne l'élimination des objets.

J'essaie d'implémenter une sorte de regroupement d'objets avec la répartition, car j'ai la liste des objets statiques qui sont fondamentalement un indicateur d'état de chaîne et booléen.

Lorsque je demande un nouvel objet distant, (en ce qui concerne le Constructor), je vérifie le pool gratuitement, marquez-le comme en usage et pendant la destruction de l'objet. Le DismisObject le marque simplement comme "gratuit",

  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;
        }
    }
}

Les délais d'attente fonctionnent bien - après 5 minutes d'activité maintenant lorsque j'essaie d'utiliser l'objet, j'ai obtenu une exception à distance, mais ~ myRemotableObject () et non les fonctions dissose () ne sont pas appelées, donc l'objet n'est jamais marqué comme libre dans la piscine. Même si je ferme le programme - l'objet reste toujours actif dans le pool. La seule façon de libérer est d'appeler manuellement la fonction disposer (ce que je ne peux pas faire si, par exemple, le programme se bloque ou que l'utilisateur quitte est ouvert)

Existe-t-il un moyen de forcer .NET à disposer / destructeur les objets lorsqu'il ferme la connexion? (J'ai trouvé à un endroit que le CG devrait le faire de temps en temps, alors j'ai ouvert 4 clients et je me suis écrasé 2 - les 2 autres ont été déconnectés après un certain temps, mais les objcets sont toujours marqués comme actifs)

Était-ce utile?

La solution

Vous pourriez peut-être utiliser ITrackingHandler Pour suivre lorsque votre objet est déconnecté, puis exécuter le code Dispose à ce moment-là.

Autres conseils

Utiliser des objets qui implémentent iDisposable dans un using construire dans la mesure du possible.

par exemple

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

Plus d'informations ici et ici.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top