Con le classi del namespace System.Windows.Messaging abbiamo a disposizione una serie di strumenti per la comunicazione tra progetti Silverlight separati. La particolarità di questo modello di comunicazione è che gli oggetti Silverlight possono essere ospitati nella stessa pagina ma anche in pagine diverse e anche in istanze diverse di browser: sender e receiver sono collegati solamente da una chiave definita programmaticamente.
L'utilizzo è molto semplice: dobbiamo dichiarare un'istanza della classe LocalMessageSender specificando nel costruttore la chiave di comunicazione e richiamare il metodo SendAsync per inviare un messaggio di tipo stinga:
LocalMessageSender sender1 = new LocalMessageSender("codeName1");
EventHandler<SendCompletedEventArgs> sendCompletedHandler = null;
sendCompletedHandler = (o, args) =>
{
  Dispatcher.BeginInvoke(() =>
  {
    sender1.SendCompleted -= sendCompletedHandler;
  });
};
sender1.SendCompleted += sendCompletedHandler;
sender1.SendAsync("messaggio di esempio");
Nel codice dell'esempio vediamo anche come registrarsi all'evento SendCompleted (e come deregistrarsi per evitare memory leak) con il quale possiamo essere notificati dell'avvenuto invio del messaggio.
Nel progetto che può ricevere i messaggi dobbiamo istanziare la classe LocalMessageReceiver specificando la stessa chiave del sender, chiamare il metodo Listen e registrarsi all'evento MessageReceived per gestire effettivamente il messaggio:
LocalMessageReceiver receiver1 = new LocalMessageReceiver("codeName1");
receiver1.MessageReceived += new EventHandler<MessageReceivedEventArgs>((o, e) =>
{
  tbl1.Inlines.Add(string.Format("Message:{0}", e.Message));
  tbl1.Inlines.Add(new LineBreak());
  tbl1.Inlines.Add(string.Format("NameScope:{0}", e.NameScope));
  tbl1.Inlines.Add(new LineBreak());
  tbl1.Inlines.Add(string.Format("ReceiverName:{0}", e.ReceiverName));
  tbl1.Inlines.Add(new LineBreak());
  tbl1.Inlines.Add(string.Format("Response:{0}", e.Response));
  tbl1.Inlines.Add(new LineBreak());
  tbl1.Inlines.Add(string.Format("SenderDomain:{0}", e.SenderDomain));
});
try
{
  receiver1.Listen();
}
catch (ListenFailedException e)
{
  MessageBox.Show(e.Message);
}Nell'esempio andiamo a vedere tutte le proprietà che abbiamo a disposizione nei dati inviati contestualmente al messaggio.
Qualora ci siano più receiver registrati con la stessa chiave, alla chiamata del metodo Listen viene sollevata una ListenFailedException che descrive questo stato.
Le funzionalità di comunicazione con Messaging possono essere utili anche in contesti dove i progetti separati vengono inclusi uno dentro l'altro e, pur non referenziando assembly comuni, possono comunicare liberamente (con le dovute cautele) pur essendo strutturalmente separati.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Escludere alcuni file da GitHub Secret Scanning
Configurare e gestire sidecar container in Azure App Service
Esporre un server MCP esistente con Azure API Management
Rendere le variabili read-only in una pipeline di Azure DevOps
Combinare Container Queries e Media Queries
Gestione delle scrollbar dinamiche in HTML e CSS
Utilizzare la funzione EF.Parameter per forzare la parametrizzazione di una costante con Entity Framework
Creare espressioni riutilizzabili nelle query LINQ per Entity Framework
Integrare modelli AI in un workflow di GitHub
Eseguire una ricerca avanzata per recuperare le issue di GitHub
Creare una libreria CSS universale: Immagini
Configurare automaticamente un webhook in Azure DevOps
I più letti di oggi
- Nascondere i contenuti con effetto Fade nella Universal Windows Platform
 - Speciale Binding di Windows Presentation Foundation
 - Rilasciata la Preview 3 di ASP.NET MVC
 - Rilasciata la versione 1.0 di ASP.NET MVC
 - Velocity arriva alla CTP3
 - Pubblicata la RC2 di ASP.NET MVC 3
 - Rilasciata ASP.NET MVC 4 Developer Preview
 - Microsoft Security Bulletin MS02-064
 - Mono 0.17 con ASP.NET
 - Da oggi accesso ai forum con il protocollo NNTP
 


