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.