運行在同一台電腦上的多個 Silverlight 應用程序可以通過本地消息進行通信,通信是在客戶端進行的,不需要與服務端交互。使用這一功能可以使在同一頁面承載的多個 Silverlight 應用程序之間或不同頁面承載的 Silverlight 應用程序之間進行通信,在網頁上承載的 Silverlight 應用程序也可以和運行在浏覽器外的其他應用程序之間進行通信。
要在 Silverlight 應用程序之間的通信,需要建一個信息發送程序和一個信息接收程序,發送端使用 LocalMessageSender 來發送信息,接收端使用 LocalMessageReceiver 來接收信息。
信息發送端:
創建發送端時需要提供一個接收端的名稱,同時也可以限定接收端所在的域,如果不提供接收端的域默認為 Global 。
view sourceprint?01 public class MainViewModel : ViewModelBase
02 {
03 private LocalMessageSender messageSender;
04 private const int MAXRETRY = 10;
05 private int retry = 1;
06
07 public string SendResult
08 {
09 get;
10 private set;
11 }
12
13 /// <summary>
14 /// Initializes a new instance of the MainViewModel class.
15 /// </summary>
16 public MainViewModel()
17 {
18 SendMessageCommand = new RelayCommand<string>(SendMessage);
19 messageSender = new LocalMessageSender("receiver1");
20 messageSender.SendCompleted += new System.EventHandler<SendCompletedEventArgs>(messageSender_SendCompleted);
21 }
22
23 private void messageSender_SendCompleted(object sender, SendCompletedEventArgs e)
24 {
25 if (e.Error != null)
26 {
27 if (retry > MAXRETRY)
28 {
29 SendResult = "Could not send message.";
30 RaisePropertyChanged("SendResult");
31 return;
32 }
33 else
34 {
35 retry++;
36 SendMessage(e.Message);
37 }
38 }
39 else
40 {
41 retry = 1;
42 SendResult = string.Concat(e.ReceiverName,":", e.Response);
43 RaisePropertyChanged("SendResult");
44 }
45 }
46
47 public RelayCommand<string> SendMessageCommand { get; private set; }
48 private void SendMessage(string msg)
49 {
50 messageSender.SendAsync(msg);
51 }
52 }
使用 SendAsync 方法來發送信息,當信息發送成功時引發 SendCompleted 事件,可以通過 SendCompletedEventArgs 的 Response 屬性來獲取從接收端返回的信息,當信息發送失敗時會拋出 SendFailedException ,可以通過 SendCompletedEventArgs 的 Error 屬性來獲取。
信息接收端:
創建接收端時需要指定接收端的名稱,同時也可以限定該名稱的范圍是限定為全局名稱范圍還是限定為接收方的特定域和限定接收方可從中接收消息的域。接收端的名稱必須在全局范圍內唯一,或者在接收端的宿主域內唯一。
view sourceprint?01 public class MainViewModel : ViewModelBase
02 {
03 private LocalMessageReceiver messageReceiver;
04
05 public string Message
06 {
07 get;
08 private set;
09 }
10
11 /// <summary>
12 /// Initializes a new instance of the MainViewModel class.
13 /// </summary>
14 public MainViewModel()
15 {
16 messageReceiver = new LocalMessageReceiver("receiver1");
17 messageReceiver.MessageReceived += new System.EventHandler<MessageReceivedEventArgs>(messageReceiver_MessageReceived);
18 try
19 {
20 messageReceiver.Listen();
21 }
22 catch (ListenFailedException e)
23 {
24 Message = e.Message;
25 RaisePropertyChanged("Message");
26 }
27 }
28
29 private void messageReceiver_MessageReceived(object sender, MessageReceivedEventArgs e)
30 {
31 e.Response = "Message received.";
32 Message = e.Message;
33 RaisePropertyChanged("Message");
34 }
35 }
接收端通過 Listen 方法監聽信息,當收到信息時引發 MessageReceived 事件,可以通過 MessageReceivedEventArgs 的 Message 屬性來獲取接收到的信息,同時可以設置 MessageReceivedEventArgs 的 Response 屬性給發送端返回一個信息。