Remoting-Sponsor wird nicht mehr angerufen

Ich habe eine App, die mehrere AppDomains in einem Prozess erstellt und über Remoting miteinander kommuniziert. Ich erstelle Sponsoren für alle Objekte, um zu verhindern, dass sie gecodet werden.

Aber einige wurden trotzdem gecodet. Nach einigen Nachforschungen habe ich festgestellt, dass abhängig von derInitialLeaseTime Auf meinen entfernten Objekten werden meine Sponsoren entweder nie oder ein paarmal und dann nie wieder angerufen.

Mein Sponsor (Ich habe einige Vernunftsprüfungen aus Gründen der Kürze entfernt):

class Sponsor : MarshalByRefObject, ISponsor, IDisposable
{
    ILease lease;

    public Sponsor(MarshalByRefObject mbro)
    {
        lease = (ILease)RemotingServices.GetLifetimeService(mbro);
        lease.Register(this);
    }

    public TimeSpan Renewal(ILease lease)
    {
        return this.lease != null ? lease.InitialLeaseTime : TimeSpan.Zero;
    }

    public void Dispose()
    {
        if(lease != null)
        {
            lease.Unregister(this);
            lease = null;
        }
    }
}

Mein Testfall:

class Program : MarshalByRefObject
{
    static void Main(string[] args)
    {
        AppDomain ad = AppDomain.CreateDomain("Remote");

        Program obj = (Program)ad.CreateInstanceAndUnwrap(
            typeof(Program).Assembly.FullName,
            typeof(Program).FullName);

        using (new Sponsor(obj))
        {
            // sleep for 6 minutes.
            // 5 seems to be the point where it gets GCed.
            Thread.Sleep(6 * 60 * 1000); 

            // throws a RemotingException
            obj.Ping();
        }
    }

    void Ping()
    {
    }

    public override object InitializeLifetimeService()
    {
        ILease lease = (ILease)base.InitializeLifetimeService();

        if (lease.CurrentState == LeaseState.Initial)
        {
            // this is the .NET default. if used, the lease is never renewed.
            //lease.InitialLeaseTime = TimeSpan.FromMinutes(5);

            // if uncommented, lease is renewed twice and never again.
            //lease.InitialLeaseTime = TimeSpan.FromMinutes(2);

            // if uncommented, lease is renewed continually.
            //lease.InitialLeaseTime = TimeSpan.FromMinutes(1);
        }

        return lease;
    }
}

Wenn ich das verlasseInitialLeaseTime Nach 5 Minuten, dem .NET-Standard, wird mein Sponsor niemals angerufen. Wenn ich es auf 2 Minuten einstelle, wird es zweimal und dann nie wieder aufgerufen. Wenn ich es auf 1 Minute einstelle, wird es fortlaufend aufgerufen und funktioniert so, wie ich erwartet habe, dass die Standardwerte funktionieren.

Aktualisieren

Ich habe da festgestellt, dass dieILease Objekte meiner Sponsoren selbst werden GCed. Sie beginnen mit der Standardmietzeit von 5 Minuten, die erklärt, wie oft meine Sponsoren angerufen werden. Wenn ich meineInitialLeaseTime bis 1min, dieILease Objekte werden aufgrund ihrer Eigenschaften ständig erneuertRenewOnCallTime der Standardwert ist 2min.

Was mache ich falsch? Ich sehe keine Möglichkeit, Sponsoren für die Leasingobjekte meiner Sponsoren zu erstellen.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage