You probably want to read some of Udi's writing, he talked about this a lot.Or
take a look at Prism, which have very similar concepts.
Don't forget that you are running on a backend thread anyway, and need to
marshal to the UI thread.

On Fri, Jun 5, 2009 at 2:54 PM, Jason Meckley <[email protected]>wrote:

>
> Ok, so if messaging is good for winforms UI, but RSB creates a new
> instance of consumers how does the UI get updated? this doesn't work.
>
> class MyForm : Form, ConsumerOf<TheNewBackgroundColor>
> {
>   Form_Load()
>   {
>         Bus.Send(new IAmReadyForMyBackgroundColortoChange());
>   }
>
>   public void Consume(TheNewBackgroundColor message)
>   {
>            BackColor = message.Color;
>   }
> }
>
> because Consume(AResponseToColorChangeRequest) would be called by a
> new instance of form.
>
> On Jun 5, 1:56 pm, Ayende Rahien <[email protected]> wrote:
> > Exactly
> >
> > On Fri, Jun 5, 2009 at 1:34 PM, Jason Meckley <[email protected]
> >wrote:
> >
> >
> >
> > > "Reply is sent to the same _endpoint_Reply is Send to the endpoint
> > > that sent
> > > the message"
> >
> > > Wait, Just read this again, it clicked. Reply is Sending back to the
> > > Sender. The instance of the sender object is not the same instance
> > > that send the message.
> >
> > > On Jun 5, 1:02 pm, Ayende Rahien <[email protected]> wrote:
> > > > Reply is sent to the same _endpoint_Reply is Send to the endpoint
> that
> > > sent
> > > > the message
> >
> > > > Messaging is a great fit for UI, but you need to use it in a push /
> pull
> > > > model.
> > > > That is, you get a message, then you tell the UI about it, handling
> the
> > > > cross thread issues along the way
> >
> > > > On Fri, Jun 5, 2009 at 12:48 PM, Jason Meckley <
> [email protected]
> > > >wrote:
> >
> > > > > Ah... So in my scenario Bus.Send() is sending the message to a new
> > > > > instance of Pong. When Pong replies, it's sent to a new instance of
> > > > > Ping, etc... None of these instances are ever displayed to the
> user.
> >
> > > > > It makes sense with Publish/Notify/Send that new instances would be
> > > > > created. This raises a few questions.
> >
> > > > > How does Reply work or what is it's purpose?
> > > > > Is it replying to the the same instance of the object that sent/
> > > > > published/notified, or is just replying to the end point, the
> actual
> > > > > instance handling the reply is different than the one who sent it?
> > > > > How is Reply different than Send()?
> > > > > (the previous 3 questions, are probably just the same question
> asked 3
> > > > > different ways :) )
> >
> > > > > The more I experiment with messaging the more it appears messaging
> > > > > doesn't seem to be a good fit for UI. Rather it's a backend
> framework/
> > > > > function. If this is true then it seems you would need an
> additional
> > > > > layer between the GUI and messaging to handle the response/
> > > > > subscription of the results of processing messages.
> >
> > > > > On Jun 5, 11:59 am, Ayende Rahien <[email protected]> wrote:
> > > > > > RSB will force components to be transient
> >
> > > > > > On Fri, Jun 5, 2009 at 11:51 AM, Jason Meckley <
> > > [email protected]
> > > > > >wrote:
> >
> > > > > > > 1st I spiked my own console app with simple console.writeline
> > > > > > > messages. this worked, so long as i blocked the instance
> > > subscription
> > > > > > > with a ManualResetEvent. didn't care for that too much as i'm
> > > blocking
> > > > > > > a thread (no performance gain) and the concept of messaging and
> a
> > > > > > > console was already provided with the source.
> >
> > > > > > > now i'm moving on to a simple winforms app. messaging seems to
> make
> > > > > > > more sense here because the UI could consume messages and
> update
> > > the
> > > > > > > interface automatically for the user.
> >
> > > > > > > here is my setup.
> > > > > > > 1 form, with 2 user controls (Ping and Pong)
> > > > > > > Ping consumes SentToPing messages and Pong consumes SentToPong
> > > > > > > messages.
> > > > > > > When form 1 is shown it tells Ping to send a message to pong
> > > > > > > Pong consumes the message, changes the background color (red,
> > > green),
> > > > > > > and replies
> > > > > > > Ping consumes the message, changes the background color
> (orange,
> > > blue)
> > > > > > > and replies
> > > > > > > This continues for 10 iterations, then replies stop.
> >
> > > > > > > all is working except:
> > > > > > > the background color does not change.
> > > > > > > no exceptions are thrown.
> > > > > > > I can step through all the code without error.
> >
> > > > > > > having zero experience with win form development am I missing
> > > > > > > something?
> > > > > > > code below.
> >
> > > > > > > public partial class Main : Form
> > > > > > > {
> > > > > > >        private readonly Ping Ping;
> > > > > > >        private readonly Pong Pong;
> >
> > > > > > >        public Main(Ping ping, Pong pong)
> > > > > > >        {
> > > > > > >                Ping = ping;
> > > > > > >                Pong = pong;
> > > > > > >                InitializeComponent();
> > > > > > >                Shown += MainShown;
> > > > > > >        }
> >
> > > > > > >        private void MainShown(object sender, EventArgs e)
> > > > > > >        {
> > > > > > >                Controls.Add(Ping);
> > > > > > >                Controls.Add(Pong);
> >
> > > > > > >                Ping.Top = 10;
> > > > > > >                Pong.Top = Ping.Height + 20;
> >
> > > > > > >                Ping.SendAMessageToPong();
> >
> > > > > > >                Shown -= MainShown;
> > > > > > >        }
> > > > > > > }
> > > > > > > public partial class Ping :
> > > > > > >        UserControl,
> > > > > > >        ConsumerOf<SendToPing>
> > > > > > > {
> > > > > > >        private readonly IServiceBus Bus;
> >
> > > > > > >        public Ping(IServiceBus bus)
> > > > > > >        {
> > > > > > >                Bus = bus;
> > > > > > >                InitializeComponent();
> > > > > > >        }
> >
> > > > > > >        public void Consume(SendToPing message)
> > > > > > >        {
> > > > > > >                var number = message.Number;
> > > > > > >                BackColor = number%2 == 0 ? Color.Orange :
> > > Color.Blue;
> >
> > > > > > >                Thread.Sleep(500);
> > > > > > >                Bus.Reply(new SendToPong {Number = number + 1});
> > > > > > >        }
> >
> > > > > > >        public void SendAMessageToPong()
> > > > > > >        {
> > > > > > >                Bus.Send(new SendToPong {Number = 1});
> > > > > > >        }
> > > > > > > }
> >
> > > > > > > public partial class Pong :
> > > > > > >        UserControl,
> > > > > > >        ConsumerOf<SendToPong>
> > > > > > > {
> > > > > > >        private readonly IServiceBus Bus;
> >
> > > > > > >        public Pong(IServiceBus bus)
> > > > > > >        {
> > > > > > >                Bus = bus;
> > > > > > >                InitializeComponent();
> > > > > > >        }
> >
> > > > > > >        public void Consume(SendToPong message)
> > > > > > >        {
> > > > > > >                var number = message.Number;
> > > > > > >                if (number > 10) return;
> >
> > > > > > >                BackColor = number % 2 == 0 ? Color.Red :
> > > Color.Green;
> >
> > > > > > >                Thread.Sleep(500);
> > > > > > >                Bus.Reply(new SendToPing {Number = number + 1});
> > > > > > >        }
> > > > > > > }
> >
> > > > > > > public class StartableForm : IStartable
> > > > > > > {
> > > > > > >        private readonly Main Form;
> >
> > > > > > >        public StartableForm(Main form)
> > > > > > >        {
> > > > > > >                Form = form;
> > > > > > >        }
> >
> > > > > > >        public void Start()
> > > > > > >        {
> > > > > > >                Application.Run(Form);
> > > > > > >        }
> >
> > > > > > >        public void Stop()
> > > > > > >        {
> > > > > > >        }
> > > > > > > }
> >
> > > > > > > public class StartableServiceBus : IStartable
> > > > > > > {
> > > > > > >        private readonly IStartableServiceBus Bus;
> >
> > > > > > >        public StartableServiceBus(IStartableServiceBus bus)
> > > > > > >        {
> > > > > > >                Bus = bus;
> > > > > > >        }
> >
> > > > > > >        public void Start()
> > > > > > >        {
> > > > > > >                Bus.Start();
> > > > > > >        }
> >
> > > > > > >        public void Stop()
> > > > > > >        {
> > > > > > >                Bus.Dispose();
> > > > > > >        }
> > > > > > > }
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Rhino Tools Dev" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/rhino-tools-dev?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to