[.NET remoting] Problemen met lifetimes, leases, sponsors

Pagina: 1
Acties:

  • whoami
  • Registratie: December 2000
  • Nu online
* whoami wijst naar de topictitel.
Dat is althans waar ik denk dat het probleem zit. ;)

Ik heb een remoted object, een service die een kanaal en dat remote object 'registreerd' en een client applicatie die gebruik maakt van dat remote object.

Nu, wat is het probleem:
alles werkt perfect, tot wanneer ik de applicatie een tijdje open laat staan. Als ik na pakweg 10 minuten geen enkele method van m'n remote object aanroep, en daarna roep ik er wel nog eens een aan, dan werkt het boeltje niet meer.

Ik maak gebruik van een Sponsor om de lease van m'n remote object te vernieuwen, zodanig dat het object niet gecollect wordt door de Garbage collector.

Ik zal ff met wat code illustreren (enkel de relevante code ):

Remote object
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class MyRemoteObject : MarshalByRefObj
{

    public override object InitializeLifetimeService()
    {
         ILease lease = (ILease)base.InitializeLifetimeService();
         if( lease.CurrentState == LeaseState.Initial )
         {
              lease.InitialLeaseTime = TimeSpan.FromMinutes(2);
              lease.SponsorshipTimeout = TimeSpan.FromMinutes(3);
              lease.RenewOnCallTime     = TimeSpan.FromMinutes(2);
         }

         return lease;
    }

}


In m'n client applicatie, registreer ik een Sponsor voor m'n remote object:
code:
1
2
3
4
5
6
7
8
9
   // Creatie van het remote object:
   _remObj = (MyRemoteObject)Activator.GetObject(typeof(MyRemoteObject), .... );
 
   // event handler aan event hangen:
   _remObj.MyEventHandler += new MyEventHandlerType(OnReceiveEvent);

   // Create a sponsor for this object:
   ILease lease = (ILease)RemotingServices.GetLifetimeService(_remObj);
   lease.Register(new MySponsor());


Ik ben er zeker van dat de sponsor van het remote object de lease gaat gaan verlengen als hij dat gevraagd wordt. Dat heb ik dmv debugging / tracing nagegaan.

In m'n clientApp heb ik dan bv volgende code:
code:
1
2
3
4
if( _connected && _remObj != null )
{
    _remObj.TriggerTheEvent();
}


Deze code werkt dus altijd goed. Als ik m'n applicatie opstart, en ik zorg ervoor dat die code uitgevoerd wordt, dan wordt m'n event getriggered.
Echter, als ik een aantal minuten wacht, en ik laat die code opnieuw uitvoeren, dan kom ik in de then - tak van die if (dat wil dus zeggen dat _remObj != null), en dan zou dus TriggerTheEvent moeten uitgevoerd worden.
Dat gebeurt dus niet, ik kan op dat moment ook niet in die method gaan steppen.
Is m'n remote object dan toch verschwunden?

MIsschien is er hier iemand met wat meer ervaring in remoting die ff een nieuw licht op m'n probleem kan laten schijnen.

Thx. :)

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Nu online
Hmmm, blijkbaar moet er toch iets met het verlengen van die lease zijn.

Ik heb nl. in m'n remote object een nieuwe method gemaakt die, als ze aangeroepen wordt, iets gaat wegschrijven naar een bestand.

Dit lukt. Het loopt echter ook fout als ik na een aantal minuten die method opnieuw aanroep.
Dan wordt er een exception gegooid, die meldt dat er niet naar dat bestand kan geschreven worden, omdat het al in gebruik is door een ander proces.

Dat wil dus zeggen -imho- dat dat remote object gedestroyed is na verloop van tijd, en dat er een
nieuwe instance van dat object gecreeërd werd.
Bij Server Activated objects (wat het in mijn geval is), wordt het remote object nl. niet geinstantieerd bij de 'creatie' v/h object (dmv de Activator.GetObject), maar wordt het geinstantieerd bij de eerste aanroep van een method van dat object. (Daarmee wordt nl. een round-trip uitgespaard).

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Nu online
Ik lees hier net in de .NET help dat, als ik de InitialLeaseTime property op 0 (zero) instel, m'n MarshalByRef object een oneindige levensduur heeft.
Daarmee zou ik m'n probleem dus kunnen oplossen, maar eigenlijk zou ik liever geen infinite lifetime hebben.
Ik zou het dus liefst aan 't werken krijgen met die sponsors enzo (gewoon omdat het mooier is, en omdat ik dat nu zo werkend wil krijgen :P ), dus als iemand hier wat meer info kan over verschaffen, you're always welcome. :P

https://fgheysels.github.io/


  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Kun je van dat remOBj geen singleton maken? En dan een tussen Object gebruiken? Als dat "tussen" object dan gefinalized wordt heb je je singleton nog. En een nieuwe object kun je weer naar de singleton laten verwijzen?

  • whoami
  • Registratie: December 2000
  • Nu online
Het remote object is een singleton.
Het wordt door m'n service geregistreerd als zijnde een Singleton; bij het registreren geef ik de WellknownObjectMode.Singleton mee.

https://fgheysels.github.io/


  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

maar ik bedoelde met een tussenlaag :)
je hebt 1 object dat op 1 of andere manier gefinalized wordt. (of iig niet meer bereikbaar is)

dan maak je een nieuw object aan en in dat object maak je een reference naar je singleton. Als je net aangemaakt object dan gefinalized heb je je singleton object nog wel.

(* wasigh filosofeert ook maar in het wilde weg)

  • whoami
  • Registratie: December 2000
  • Nu online
Ik heb een proxy in m'n client applicatie, die de calls dan redirect naar m'n remote object.

Echter, die MarshalByRef objects hebben geen 'indifenite' liftetime, en worden dus automatisch gedestroyed als hun lifetime op is.
Ik ga thuis ff testen met die InitialLeaseTime op 0 te zetten.

Daarna zal ik ook nog eens die sponsor enzo onder de loupe moeten nemen.

https://fgheysels.github.io/


Verwijderd

Als je een Singleton voor altijd wil laten leven moet je InitializeLifetimeService als volgt implementeren:

code:
1
2
3
4
public override Object InitializeLifetimeService()
{
   return null;
}

  • whoami
  • Registratie: December 2000
  • Nu online
Verwijderd schreef op 07 October 2003 @ 17:51:
Als je een Singleton voor altijd wil laten leven moet je InitializeLifetimeService als volgt implementeren:

code:
1
2
3
4
public override Object InitializeLifetimeService()
{
   return null;
}
Ik heb dat net even zo gedaan, maar het probleem blijft bestaan.

Ik krijg nu -als ik een tijdje wacht om nog eens die remote method aan te roepen- een RemotingException met als message: De aangevraagde service is niet gevonden.

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Nu online
Ik heb het nu eens geprobeerd om de InitialLeaseTime op zero te initialiseren:

code:
1
2
3
4
5
6
7
8
9
public override object InitializeLifetimeService()
{
    ILease lease = (ILease)base.InitializeLifetimeService();
    if( lease.CurrentState == LeaseState.Initial )
    {
          lease.InitialLeaseTime = TimeSpan.Zero;
    }
    return lease;
}


Echter, ook dat brengt geen soelaas.
Na verloop van tijd krijg ik ook de RemotingException met als message: "the requested service cannot be found".

I'm running out of options here.
Normaal gezien zou het object niet mogen expiren als de leasetime op zero ingesteld staat, en volgens Bierdopje zou je het zelfde effect moeten verkrijgen als je die method null laat returnen.
Echter, in beide gevallen krijg ik na verloop van tijd dezelfde error.

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Nu online
Ik heb een destructor in m'n Remote object gezet waarin ik niets anders doe dan iets naar een file wegschrijven:
code:
1
2
3
4
5
6
7
8
~Messenger()
{
    FileStream fs = new FileStream ("c:\\destr.txt", FileMode.Create, FileAccess.Write);
    StreamWriter wr = new StreamWriter(fs);
    wr.WriteLine ("blaat");
    wr.Flush();
    fs.Close();
}


Als ik m'n applicatie run, en ik wacht even voordat ik m'n remote object opnieuw aanspreek, en m'n applicatie crashed (zie bovenstaande exception), dan is die file nog niet weggeschreven.
Ik vermoed dus dat het remote object op dat moment nog niet gedestroyed is.

Als ik daarna m'n client-applicatie afsluit, en ook m'n Service die het remote object host stop, dan wordt die file wel (direct) weggeschreven.

https://fgheysels.github.io/


Verwijderd

Je kan er niet vanuit gaan dat je constructor wordt aangeroepen op het moment dat er geen referentie meer is naar dat object. Dat hangt van de garbage collection af.
Volgens mij kan je hier dus geen conclusie uit trekken.

Wat is trouwens het verschil tussen je eigen sponsor (MySponsor) en de System.Runtime.Remoting.Lifetime.ClientSponsor klasse?

[ Voor 23% gewijzigd door Verwijderd op 10-10-2003 13:49 ]


  • whoami
  • Registratie: December 2000
  • Nu online
Verwijderd schreef op 10 October 2003 @ 13:47:
Je kan er niet vanuit gaan dat je constructor wordt aangeroepen op het moment dat er geen referentie meer is naar dat object. Dat hangt van de garbage collection af.
Volgens mij kan je hier dus geen conclusie uit trekken.
Destructor bedoel je. ;)
Inderdaad, dat weet ik wel. Echter, al wacht ik een uur, die destructor wordt niet aangeroepen.
Van zodra ik m'n service stop, wordt hij wel aangeroepen.
Verwijderd schreef op 10 October 2003 @ 13:47:

Wat is trouwens het verschil tussen je eigen sponsor (MySponsor) en de System.Runtime.Remoting.Lifetime.ClientSponsor klasse?
M'n eigen sponsor is een klasse die de ISponsor interface implementeert.
Naar die ClientSponsor class heb ik nog niet gekeken, dat zal ik dit weekend eens doen.

[ Voor 29% gewijzigd door whoami op 10-10-2003 13:53 ]

https://fgheysels.github.io/


Verwijderd

Destructor klopt idd iets beter in het verhaal :)

Het kan zijn dat er nog steeds een referentie naar dat object in de cache,
Dat zou mogen omdat het een singleton is. Je proxy hoeft dan echter niet meer te kloppen volgens mij.

Volgens mij moet je trouwens de andere ILease.Register methode hebben.
Met de tweede parameter specificeer je de renewal tijd...
De methode die jij gebruikt renewed niet.
Zie: http://msdn.microsoft.com...aseclassregistertopic.asp

[ Voor 28% gewijzigd door Verwijderd op 10-10-2003 13:58 ]


  • whoami
  • Registratie: December 2000
  • Nu online
Verwijderd schreef op 10 October 2003 @ 13:54:

Volgens mij moet je trouwens de andere ILease.Register methode hebben.
Met de tweede parameter specificeer je de renewal tijd...
De methode die jij gebruikt renewed niet.
Dat zal ik ook dit weekend eens uittesten.
Echter, die renewal tijd wordt toch in m'n Remote Object gespecifieerd, met die InitializeLifetime method?
Ik kan me nochtans herinneren dat die Renewal method van m'n Sponsor wel degelijk aangeroepen werd.

Ik kan het hier nu niet testen, morgen zal ik er ff mee spelen.

[ Voor 17% gewijzigd door whoami op 10-10-2003 14:00 ]

https://fgheysels.github.io/


Verwijderd

whoami schreef op 10 October 2003 @ 13:59:

Echter, die renewal tijd wordt toch in m'n Remote Object gespecifieerd, met die InitializeLifetime method?
Daarmee geef je aan hoelang je je server object alife wil houden als de lease niet vernieuwd wordt.

Met de register methode geef je aan hoe vaak je je lease wil vernieuwen vanaf de client...

  • whoami
  • Registratie: December 2000
  • Nu online
Verwijderd schreef op 10 October 2003 @ 14:05:
[...]

Daarmee geef je aan hoelang je je server object alife wil houden als de lease niet vernieuwd wordt.

Met de register methode geef je aan hoe vaak je je lease wil vernieuwen vanaf de client...
Vaag, dan zou die lease steeds maar 1x vernieuwd worden en zou die method dus eigenlijk overbodig zijn. :?
Zal het deze avond of morgen eens uittesten.

Maar dan blijft wel m'n vraag hoe het dan ook nog komt dat m'n Object blijkbaar wel verschwunden is, ook al staat de LeaseTime op zero, waardoor hij niet zou mogen expiren?


Weet je trouwens geen goeie tutorials/ebooks/boeken ivm remoting?

https://fgheysels.github.io/


Verwijderd

whoami schreef op 10 October 2003 @ 14:10:
[...]
Vaag, dan zou die lease steeds maar 1x vernieuwd worden en zou die method dus eigenlijk overbodig zijn. :?
Nee, het is een initialisatie van je server, die hoort maar 1x uitgevoerd te worden.
De sponser moet echter vaker aangeroepen worden, dat stel je in met ILease.Register.
Misschien expired het remote object meteen als de lease tijd op 0 staat.
Zet hem eens op 2 minuten en de sponsor op 1 minuut. Dat moet goed gaan.

Ik gebruik "C# voor professionals van wrox" (die falliet is :( ) en MSDN.

  • whoami
  • Registratie: December 2000
  • Nu online
Ja, dat weet ik, dat die Sponsor renewal meerdere keren moet aangeroepen worden, echter, het gaat nu weer fout.

Ik heb dus m'n sponsor geregistreerd door de Register method met 2 argumenten. In de Renewal method van m'n sponsor heb ik ook wat code toegevoegd, zodat er naar een regeltje tekst naar een file geschreven wordt als die method aangeroepen wordt.

Ik krijg nu een TargetInvocation exception. In m'n tekst(log) bestandje, zie ik dat de sponsor 2x is aangeroepen geweest.

* whoami gaat ook ff verder zoeken dit weekend.
Dat boek dat jij aanhaalt heb ik ook, maar ik heb die nog niet gebruikt in m'n quest. (Had er nog niet aan gedacht :D), ik gebruik momenteel een boek van MS.

De method van m'n remote object die ik aanroep, roept op zijn beurt ook een delegate aan, voor meer informatie zie topic

[ Voor 13% gewijzigd door whoami op 10-10-2003 19:02 ]

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Nu online
Zeer vreemd....
M'n lease wordt zeker op geregelde tijdstippen vernieuwd, dat kan ik halen uit m'n debug-informatie.
Echter, het lijkt wel dat m'n lease niet vernieuwd wordt als het programma een tijdje 'idle' is.

Het lijkt wel dat, zolang ik m'n remote object geregeld eens aanspreek, dat alles goed verloopt. Laat ik m'n remote object een aantal minuten voor wat het is, dan is het net alsof hij de lease niet aangesproken heeft.

Het lijkt wel of de lease enkel vernieuwd wordt als het remote object aangesproken wordt binnen de sponsortimeout timeoutspan ofzo.

* whoami gaat verder met z'n zoektocht.

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Nu online
Ik lees hier net in m'n boek dat de lease-time iedere keer impliciet vernieuwd wordt als er een method van het remote object aangeroepen wordt, en de CurrentLeaseTime < RenewOnCallTime.

Daarmee ben ik dus nog niet zeker of die sponsor z'n werk wel goed doet. Ik ben het nu eens aan het testen met de ClientSponsor class.

Deze heb ik zo geregistreerd in m'n client:
code:
1
2
ILease lease = (ILease)RemotingServices.GetLifetimeService(_myRemoteObject);
lease.Register(new ClientSponsor(TimeSpan.FromMinutes(2)), TimeSpan.FromMinutes(2));

https://fgheysels.github.io/


  • Prozaq
  • Registratie: Juni 2000
  • Laatst online: 14:04
Dat het object niet wordt opgeruimd zolang je het blijft aanroepen komt door de renewoncalltime parameter (zie msdn)

Zou het misschien kunnen dat je clientsponser object na verloop van tijd wordt opgeruimd door deze constructie:
lease.Register(new ClientSponsor(TimeSpan.FromMinutes(2)), TimeSpan.FromMinutes(2));

[ Voor 6% gewijzigd door Prozaq op 12-10-2003 12:13 ]


  • whoami
  • Registratie: December 2000
  • Nu online
Prozaq schreef op 12 oktober 2003 @ 12:12:
Dat het object niet wordt opgeruimd zolang je het blijft aanroepen komt door de renewoncalltime parameter (zie msdn)
De RenewOnCallTime parameter bepaald de tijdspanne met welke de lease-time moet worden verlengd als de renew method van de sponsor aangeroepen wordt.

M'n sponsor renewed wel nu en dan m'n lease, zolang het programma geregeld in gebruik is. Als het een tijdje niet in gebruik is (gewoon idle dus), dan wordt die lease blijkbaar niet meer vernieuwd.
Zou het misschien kunnen dat je clientsponser object na verloop van tijd wordt opgeruimd door deze constructie:
lease.Register(new ClientSponsor(TimeSpan.FromMinutes(2)), TimeSpan.FromMinutes(2));
Ik denk het niet.
code:
1
2
ClientSponsor p = new ClientSponsor();
lease.Register(p);

is eigenlijk niets anders dan de code in m'n voorbeeld.

Die lease heeft een referentie naar die sponsor, dus wordt die niet ge-GC'ed. Mocht dat wel zo zijn, dan zou mijn programma er wel uitklappen met een Access Violation oid.

[ Voor 10% gewijzigd door whoami op 12-10-2003 12:34 ]

https://fgheysels.github.io/


  • Prozaq
  • Registratie: Juni 2000
  • Laatst online: 14:04
Renewoncalltime verlengt de lifetime van het remote object bij een method aanroep hierop. Dus als je constant doiets() aanroept op je remote object, dan wordt iedere keer de toegestane liftetime verhoogd. Enkel het feit dat je constant iets aanroept op het remote object houdt deze in leven.
Die lease heeft een referentie naar die sponsor, dus wordt die niet ge-GC'ed.
Ik vind dit een gevaarlijke aanname maar het zou best kunnen. Ik denk overigens niet dat het main programma iets zou merken van het feit dat je sponsor is opgeruimd.

kijk eens naar dit draadje, en dan vooral de 2e post hoe je je channel instantieert
http://groups.google.nl/g...0posting.google.com#link1

[ Voor 3% gewijzigd door Prozaq op 12-10-2003 13:01 ]


  • whoami
  • Registratie: December 2000
  • Nu online
Prozaq schreef op 12 oktober 2003 @ 13:00:
Renewoncalltime verlengt de lifetime van het remote object bij een method aanroep hierop. Dus als je constant doiets() aanroept op je remote object, dan wordt iedere keer de toegestane liftetime verhoogd. Enkel het feit dat je constant iets aanroept op het remote object houdt deze in leven.
Ik heb dat net ff opgezocht, en de lease wordt idd verlengd met de waarde gespecifieerd in die property, iedere keer eer een method aangeroepen wordt.
Ik zal nog eens verder zoeken naar m'n sponsor probleem.

Echter, de renewal method zou door de GC moeten aangeroepen worden volgens de help. Dus, eventueel het overriden van die method, en het registreren van m'n sponsor zou toch voldoende moeten zijn.
Ik vind dit een gevaarlijke aanname maar het zou best kunnen. Ik denk overigens niet dat het main programma iets zou merken van het feit dat je sponsor is opgeruimd.
Dat is geen aanname, dat is gewoon zo.
Een object wordt niet gedestroyed zolang er een referentie naar is.
Aangezien je die sponsor registreert , zal er dus wel een referentie naar zijn.
kijk eens naar dit draadje, en dan vooral de 2e post hoe je je channel instantieert
http://groups.google.nl/g...0posting.google.com#link1
Die 2de post is gewoon best logisch.
Die eerste constructor definieert een client-channel.
De constructor met 0 als argument, registreert een channel op een port die door het OS gekozen wordt.
Ikzelf registreer m'n client-channel ook met een 0 als argument, gewoon omdat ik op m'n client een channel nodig heb die in beide richtingen messages kan sturen.

Zoals je hier kunt zien, laat ik het OS ook een port kiezen in m'n client channel:
code:
1
2
3
4
5
IDictionary properties = new Hashtable();
properties.Add("port", 0);
                
_chan = new HttpChannel(properties, clpr, prov);
ChannelServices.RegisterChannel(_chan);


Ik gebruik dan wel niet die constructor, maar ik specifieer mn port via een hashtable.
Ik zal voor alle zekerheid eens zelf een poortnummer opgeven ipv die 0.

[ Voor 20% gewijzigd door whoami op 12-10-2003 14:09 ]

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Nu online
Ik heb nu eens zelf m'n port gespecifieerd via m'n HashTable (ipv die 0 dus), maar dat lost m'n probleem niet echt op.

Van die constructor die ik gebruik, daar kan ik echt niet van onderuit. Ik gebruik nl. delegates in m'n remote object, en als ik die in .NET 1.1 wil uitvoeren, dan moet ik een FormatterSinkProvider meegeven.
Normaal gezien zou ik trouwens toch al zowiezo een 2-way channel moeten hebben, want dat heb ik ook nodig voor m'n delegates.

https://fgheysels.github.io/


Verwijderd

Gooi al je code anders even over de mail. Kwil wel even snel kijken of ik nog wat geks zie.

  • whoami
  • Registratie: December 2000
  • Nu online
Ik zal het vanavond ff mailen, en ik zal zelf ook nog eens alles nagaan. thx.

Ik heb het net ff in .NET 1.0 geprobeerd, waar ik dus geen FormatterSinkProviders moet meegeven aan m'n channels, en ook daar heb ik dezelfde fout.

Ik maak wel gebruik van Server Activated objects, maar die worden als 'Singletons' geregistreerd, niet als SingleCalls, dus die sponsors zouden daar toch moeten mee werken?

https://fgheysels.github.io/


Verwijderd

Heb net je code getest. En vond hetzelfde probleem als ik jouw sponsor gebruikte.

Het probleem is dat je je sponsor niet goed implementeerd. Die renewed niet.
Als je ClientSponsor gebruikt gaat het wel goed.

Ik heb ook nog geprobeerd om jouw sponsor af te leiden van ClientSponsor en dat werkt ook goed. Hoe je echter een sponsor maakt zonder af te leiden van ClientSponsor heb ik nog niet gevonden. Zou eigenlijk de sourcecode van ClientSponsor moeten bekijken.
De sourcecode van mono voor ClientSponsor was nog niet af.

Om ClientSponsor af te leiden moet je de volgende aanpassingen doen:
code:
1
2
3
4
5
public class MessengerSponsor : ClientSponsor, ISponsor
{
   ....
   TimeSpan ISponsor.Renewal(ILease lease)
   {

Je hoeft in ISponsor.Renewal niet de base aan te roepen.

Om je afgeleide sponsor te registreren werkt de volgende code:
code:
1
2
ILease lease = (ILease)RemotingServices.GetLifetimeService(_msn);
lease.Register(new MessengerSponsor(), TimeSpan.FromMinutes(2));

[ Voor 5% gewijzigd door Verwijderd op 14-10-2003 12:36 ]


Verwijderd

Je server events werken trouwens niet als je de client en server in andere directories draait, omdat dan de server geen klasse informatie uit de client assemblies kan lezen. Dit kan je oplossen door een klasse "in-the-middle" te definieren die je event forwarding regelt. Volgens mij heb ik hierover wel eens een thread gezien.
En anders is hier een link naar een voorbeeld:klik

Je gaat trouwens ook problemen krijgen als je clients wegvallen zonder te deregistreren. Dit kan je aanpassen met synchronisatie en het implementeren van de add en remove van je event. Een voorbeeld kan je hier vinden:
http://staff.develop.com/woodring/dotnet/#fireserverevents

[ Voor 14% gewijzigd door whoami op 14-10-2003 19:35 ]


  • whoami
  • Registratie: December 2000
  • Nu online
Thx.
Ik zal er vanavond eens naar kijken.

https://fgheysels.github.io/


  • Prozaq
  • Registratie: Juni 2000
  • Laatst online: 14:04
Misschien wat laat (had de draad iets te snel doorgelezen en het singleton over het hoofd gelezen), maar waarom maak je uberhaupt gebruik van leases als je remote object een singleton is? Is het niet handiger om de singleton een infinite lifetime te geven? Ik zie zo 123 het nut niet in van het om de zoveel tijd een nieuwe singleton aanmaken.

Verwijderd

Ik denk dat je wel een puntje hebt,
alleen had het probleem denk ik ook opgetreden als het een client activated object was.

  • whoami
  • Registratie: December 2000
  • Nu online
Inderdaad, Prozaq heeft wel een punt.
Echter, ik wou wat spelen met die sponsors ed. Daarbij krijg ik dezelfde problemen als ik InitializeLifeTimeService null laat returnen. :?

https://fgheysels.github.io/


Verwijderd

Dit verduidelijkt volgens mij een hoop:
http://msdn.microsoft.com...l/cpconlifetimeleases.asp

De InitialLeaseTime moet dus op TimeSpan.Zero gezet worden voor een oneindige lease (Remote Object).
Dit moet je echter alleen gebruiken met een singleton,
anders heb je een memory leak.

Om zelf een een sponsor te maken moet je dus volgens mij in de ISponsor.Renew(ILease) methode ILease.Renew(TimeSpan) aanroepen om de lease ook echt te vernieuwen.
Dat zal de reden zijn waarom de eigen sponsor niet werkte.

  • whoami
  • Registratie: December 2000
  • Nu online
Verwijderd schreef op 15 October 2003 @ 15:15:
De InitialLeaseTime moet dus op TimeSpan.Zero gezet worden voor een oneindige lease (Remote Object).
Dat had ik ook al geprobeerd, same result. :/

https://fgheysels.github.io/


  • Scare360
  • Registratie: Juli 2001
  • Laatst online: 20-08 18:43
Misschien dat je Advanced .NET Remoting eens moet inzien, daar staat namelijk een schitterend voorbeeld van client/server sponsers.

Verwijderd

whoami schreef op 15 October 2003 @ 15:21:
[...]

Dat had ik ook al geprobeerd, same result. :/
Ik heb het net ook getest en bij mij werkt het gewoon.

Wat ik gedaan heb is de InitializeLifetimeService van het remote object veranderd in:
code:
1
2
3
4
5
6
7
8
9
10
11
public override object InitializeLifetimeService()
{
    ILease lease = (ILease)base.InitializeLifetimeService();
    
    if(lease.CurrentState == LeaseState.Initial )
    {               
        lease.InitialLeaseTime   = TimeSpan.Zero;
    }
    
    return lease;                       
}


En ik heb alles wat te maken had met leases en sponsors uit de client gehaald.

Aangezien je singleton een infinite lifetime heeft, hoef je niet meer met sponsors te werken.

  • whoami
  • Registratie: December 2000
  • Nu online
Verwijderd schreef op 16 October 2003 @ 15:49:
[...]

Ik heb het net ook getest en bij mij werkt het gewoon.
Zeer vreemd.
Je wacht ook een aantal minuten eer je die event triggered?

https://fgheysels.github.io/


Verwijderd

Meer dan een kwartier...
Wat is precies de foutmelding die je dan krijgt?
Heb je een stacktrace voor me?

  • whoami
  • Registratie: December 2000
  • Nu online
Ik krijg volgende exceptie en stacktrace:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
System.Runtime.Remoting.RemotingException: Object </60572c85_f3f2_4148_842c_10832a4094c2/28075203_1.rem> has been disconnected or does not exist at the server.

Server stack trace: 
   at System.Runtime.Remoting.Channels.ChannelServices.CheckDisconnectedOrCreateWellKnownObject(IMessage msg)
   at System.Runtime.Remoting.Channels.ChannelServices.DispatchMessage(IServerChannelSinkStack sinkStack, IMessage msg, IMessage& replyMsg)
Exception rethrown at [0]: 
   at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   at FGMessenger.frmMain.MessageSubmitted(Object sender, MessengerEventArgs e)
   at MessengerManager.Messenger.Send(String user, String text)
   at System.Runtime.Remoting.Messaging.StackBuilderSink.PrivateProcessMessage(MethodBase mb, Object[] args, Object server, Int32 methodPtr, Boolean fExecuteInContext, Object[]& outArgs)
   at System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg, Int32 methodPtr, Boolean fExecuteInContext)
Exception rethrown at [1]: 
   at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)


In de initializelifetimeservice wordt de InitialLeaseTime op TimeSpan.Zero geinitialiseerd.

https://fgheysels.github.io/

Pagina: 1