当前位置:编程学习 > C#/ASP.NET >>

Silverlight应用程序之间在客户端通信

运行在同一台电脑上的多个 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

补充:软件开发 , C# ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,