Questa è probabilmente la feature che più mi intriga di Silverlight3 quando funzionerà a dovere (more later…)
In pratica: attraverso le local connections è possibile far comunicare tra loro applicazioni Silverlight senza passare dall’ HTML bridge ma attraverso un semplice meccanismo di publish-subscribe.
L’applicazione che vedete nella foto contiene due plug-ins, scrivendo nella texbox in alto il testo viene replicato nella textbox inferiore.

L’applicazione Sender non fa altro che creare un istanza di LocalMessageSender indicando il nome associato al LocalMessageReceiver che sarà in grado di ricevere i messaggi inviati sottoforma di stringa (nel mio caso “Test”).

 image 

public partial class MainPage : UserControl
{
    private LocalMessageSender messageSender = new LocalMessageSender("Test");
 
    public MainPage()
    {
        InitializeComponent();
        messageSender.SendCompleted += new EventHandler<SendCompletedEventArgs>(messageSender_SendCompleted);
    }
 
    void messageSender_SendCompleted(object sender, SendCompletedEventArgs e)
    {
        if (e.Error == null)
        {
            Dispatcher.BeginInvoke(() =>
            {
                txtMsg.Text = e.Response;
            });
        }
    }
 
    private void HandleTextChanged(object sender, TextChangedEventArgs e)
    {            
        messageSender.SendAsync(txtSender.Text);
    }
}

Il Receiver è ancora più semplice:

public partial class MainPage : UserControl
{
    private LocalMessageReceiver receiver = new LocalMessageReceiver("Test");
 
    public MainPage()
    {
        InitializeComponent();
        
        this.receiver.MessageReceived += new EventHandler<MessageReceivedEventArgs>(receiver_MessageReceived);
        try
        {
            this.receiver.Listen();
        }
        catch (Exception ex)
        {
            txtErr.Text = ex.Message;
        }
    }
 
    void receiver_MessageReceived(object sender, MessageReceivedEventArgs e)
    {
        Dispatcher.BeginInvoke(() =>
            {
                txtReceiver.Text = e.Message;
            });
 
        e.Response = string.Format("Received at {0}", DateTime.Now.ToLongTimeString());            
    }
}

Come potete notare il receiver nell’evento MessageReceived invia una risposta al sender attraverso la proprietà Response.

Decisamente più semplice rispetto a quanto bisognava fare con Silverlight2 sopratutto perchè la comunicazione non è limitata alla singola pagina ma può essere cross page e cross browser, out of browser applications incluse.
I costruttori di LocalMessageSender e LocalMessageReceiver hanno un overload che permette di specificare se lo scambio di messaggi è globale oppure limitato solo tra applicazioni provenienti da domini ben precisi.
Al momento sembra esserci un bug quando si inviano stringe vuote e, almeno nella mia installazione, non sono supportate più istanze dello stesso receiver, ecco il motivo del try/catch nel costruttore del receiver (vi ho già detto che Murphy è seduto qui di fianco a me? smile_regular).