運行在同一台電腦上的多個 Silverlight 應用程式可以通過本地消息進行通信,通信是在用戶端進行的,不需要與服務端交互。使用這一功能可以使在同一頁面承載的多個 Silverlight 應用程式之間或不同頁面承載的 Silverlight 應用程式之間進行通信,在網頁上承載的 Silverlight 應用程式也可以和運行在瀏覽器外的其他應用程式之間進行通信。
要在 Silverlight 應用程式之間的通信,需要建一個資訊反射程式和一個資訊接收程式,發送端使用 LocalMessageSender 來發送資訊,接收端使用 LocalMessageReceiver 來接收資訊。
資訊發送端:
創建發送端時需要提供一個接收端的名稱,同時也可以限定接收端所在的域,如果不提供接收端的域預設為 Global 。
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 屬性來獲取。
資訊接收端:
創建接收端時需要指定接收端的名稱,同時也可以限定該名稱的範圍是限定為全域名稱範圍還是限定為接收方的特定域和限定接收方可從中接收消息的域。接收端的名稱必須在全域範圍內唯一,或者在接收端的宿主域內唯一。
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 屬性給發送端返回一個資訊。
創作者介紹
創作者 shadow 的頭像
shadow

資訊園

shadow 發表在 痞客邦 留言(0) 人氣()