[Mono-list] Garbage-collecting a remoting singleton object in a service?
"Andrés G. Aragoneses [ knocte ]
"Andrés G. Aragoneses [ knocte ]
Mon Sep 4 04:32:37 EDT 2006
Robert Jordan escribió:
>> I am interested in implementing a service (windows service in windows,
>> and using mono-service on linux, I suppose) that hosts a singleton
>> remoting object. As I have read on some docs, no leasing management is
>> needed if no SAO/CAO hosting method is used (returning null in
>> InitializeLifeTimeService method, as I will use a Singleton instance)
>> but, how can I garbage-collect manually this server object on the
>> OnStop() method of the service (so as to create a new instance again on
>> the OnStart method)?
>
> To achieve this, you have to register the singleton object manually.
>
> Throw away the <service> entry from you server's remoting config
> and use this code instead (in server's code, of course):
>
>
> YourServerClass singleton;
>
> OnStart ()
> {
> singleton = new YourServerClass ();
> RemotingServices.Marshal (singleton, objectUri);
> }
>
> OnStop ()
> {
> RemotingServices.Disconnect (singleton);
> // do what you called "garbage-collect manually".
> }
>
>
> where "objectUri" is the objectUri-attribute you previously
> used in server's remoting config.
Thanks for the answers Robert and Lluis. I was using the Disconnect
method but I was unsure if it was the thing I needed; in fact, it's a
bit strange that the "opposite" of Disconnect is Marshal, instead of
Connect, which I think is the method used by the other side (the
clients) if they don't use the Activator.GetObject() form.
BTW, I am supposing that the garbage-collection of the client objects is
automatic because I store them as IClient objects, not as
MarshalByRefObject, am I right?
I mean, when a client logs into my server, I store it's reference with:
class Server : MarshalByRefObject , IServer {
private object oLock = new object();
private IDictionary<string, IIrmRemotingClient> hClients =
new Dictionary<string, IIrmRemotingClient>();
public void Login(IClient oClient){
lock(this.oLock){
this.hClients.Add(oClient.Guid, oClient);
}
}
}
When the client disconnects, I remove the reference to the object with:
public void Logout(IClient oClient){
lock(this.oLock){
if (this.hTerminal.ContainsKey(oClient.Guid)){
this.hTerminal.Remove(oClient.Guid);
}
}
}
Is this garbage-collecting them too?
Thanks again.
Regards,
Andrés [ knocte ]
--
More information about the Mono-list
mailing list