[Mono-dev] Remoting Server Events problem

Robert Jordan robertj at gmx.net
Sun Nov 25 18:14:02 EST 2007


buhochileno at gmail.com wrote:
> Thanks Robert, I very confuse with this, becouse I read a lote of 
> diferent approach (event broadcast engines, shared objects, etc) to do 
> this, but most of them don't work :-S ,  I wondore if you have a simple 
> working example of the correct way to do this?

Events only make sense in local cross appdomain contexts.
Anything else is a world of pain. See

The attached sample is still using events on the server side but
it requires that clients implement a certain interface that
was declared in the shared assembly.

The server is using a special "AsyncEvent" that doesn't have the
drawbacks of a simple CLI event:

- the clients are notified sequentially. This doesn't scale

- if a client doesn't respond, the next clients won't be called
   back anymore. This is far from being reliable.

AsyncEvent is calling the clients in parallel and it also disconnects
failing clients. This is still not optimal because it doesn't scale
at large: Imagine you have 1000 connected clients ...


> in advance, thank you very much.
> Mauricio
> Robert Jordan wrote:
>> buhochileno at gmail.com wrote:
>>> Hi:
>>> I know that is very possible that this is a basic remoting question, but 
>>> I read some info about the native .NET approach used with remoting and I 
>>> think that my code is supose it to work:
>>> I write a class with a method to trigger some event (this is the object 
>>> resgitered by the remoting server):
>>> [Serializable]
>>> public class Camera: MarshalByRefObject
>>> ...
>>>    public void SetZoom(int amount)
>>>    {...//zoom code
>>>        SomeDelegate h = this.SomeEvent; //some test event triger, the 
>>> SomeDelegate is public...
>>>        if ((h != null) && (SomeEvent != null))
>>>                h (this, new EventArgs());
>>>        else
>>>                Console.WriteLine("null then?"); //allways is null
>>>       }
>>> ...On the client side I use a special "RemoteCamera", this class deal 
>>> with all the remoting stuff related to get the object from the 
>>> server...something like:
>>> [Serializable]
>>> public class RemoteCamera: MarshalByRefObject
>>>        public RemoteOrbitKit()
>>>        { .../channel registration, etc...
>>> camera(ICamerat)Activator.GetObject(typeof(ICamera),_fullObjectURLPath); 
>>> //....
>>>            camera.SomeEvent += new SomeDelegate(SomeMethod);
>>>             ...
>>>             camera.SetZoom(50); //this work, but the event is not 
>>> triggered...
>>>        }
>>>        public SomeMethod(object sender, EventArgs e)
>>>        {
>>>             Console.WriteLine("method called"); //This methis is never 
>>> called becouse the Event/method asociation allways is null
>>>        }
>>> Do you see what is my mistake?
>>> sugestions?, ideas?
>> 1. The server must know the type "RemoteCamera", because the delegate
>>     is containing a reference to an instance of this class.
>>     You can circumvent this by using a public static method as
>>     an event handler.
>> 2. The client must start a listener as well. This is done with
>>     "new TcpChannel (0)" or "new HttpChannel (0)" or with a
>>     corresponding remoting configuration setting.
>> 3. The client must not be firewalled because it is
>>     called back by the server.
>> Robert
>> _______________________________________________
>> Mono-devel-list mailing list
>> Mono-devel-list at lists.ximian.com
>> http://lists.ximian.com/mailman/listinfo/mono-devel-list

-------------- next part --------------
A non-text attachment was scrubbed...
Name: remoting-events.tar.gz
Type: application/x-gzip
Size: 1856 bytes
Desc: not available
Url : http://lists.ximian.com/pipermail/mono-devel-list/attachments/20071126/f21e2fa8/attachment.gz 

More information about the Mono-devel-list mailing list