基于Silverlight的本地应用程序之间的通信(2)
在该示例中,在全局范围向接收器提供一个名称,并且接收器可以接收来自任何域的消息。发送器也 指定全局范围。全局范围很有用,这样,发送器无需知道接收器的域。但是,在您使用全局范围时,应仔 细选择接收器名称,以便避免可能的冲突。有关更多信息,请参见本主题后面的"高级方案和疑难解答"一 节。
在创建接收器和发送器对象后,为 LocalMessageReceiver.MessageReceived 和 LocalMessageSender.SendCompleted 事件添加处理程序以便完成配置。这些事件在下一节中讨论。
在完全配置好接收器后,调用 LocalMessageReceiver.Listen 方法。此方法注册接收器的标识并使其 能够接收 MessageReceived 事件。如果已经存在用相同名称和名称范围注册的接收器,此方法还引发 ListenFailedException。例如,如果您使用一个硬编码的接收器名称并且用户将您的宿主网页同时加载 到多个浏览器窗口或选项卡中,将可能会引发上述异常。有关更多信息,请参见"高级方案和疑难解答"一 节。
在调用 Listen 方法后不能修改接收器配置。接收器将继续接收消息,直到调用其 Dispose 方法。
下面的代码示例演示完整的配置详细信息,在该配置中接收应用程序和发送应用程序承载在同一域中 。
VB
' In the receiving application:
Dim messageReceiver As New LocalMessageReceiver("receiver")
AddHandler messageReceiver.MessageReceived, _
AddressOf receiver_MessageReceived
Try
messageReceiver.Listen()
Catch ex As ListenFailedException
MessageBox.Show( _
"Cannot receive messages." & Environment.NewLine & _
"There is already a receiver with the name 'receiver'.", _
"LocalMessageReceiver", MessageBoxButton.OK)
End Try
' In the sending application:
Dim messageSender As New LocalMessageSender("receiver")
AddHandler messageSender.SendCompleted, _
AddressOf sender_SendCompleted
发送消息和接收响应
要发送消息,发送应用程序调用 SendAsync 方法,传入最大 40 KB 的 String 消息。如果该消息被 成功接收,则在接收应用程序中将发生 LocalMessageReceiver.MessageReceived 事件,并且该消息可用 于 MessageReceivedEventArgs.Message 属性中。
接收应用程序可以通过设置 MessageReceivedEventArgs.Response 属性,发送来自 MessageReceived 事件处理程序的响应。为了接收该响应,发送应用程序可以处理 LocalMessageSender.SendCompleted 事 件并获取 SendCompletedEventArgs.Response 属性。
下面的代码示例显示一个简单的消息和响应交换。
C#
// In the sending application: private void SendMessage(LocalMessageSender messageSender) { MessageBox.Show("Sending message \"message\".", "LocalMessageSender", MessageBoxButton.OK); messageSender.SendAsync("message"); } // In the receiving application: private void receiver_MessageReceived(object sender, MessageReceivedEventArgs e) { MessageBox.Show("Message \"" + e.Message + "\" received. Sending response \"response\".", "LocalMessageReceiver", MessageBoxButton.OK); e.Response = "response"; } // In the sending application: private void sender_SendCompleted(object sender, SendCompletedEventArgs e) { MessageBox.Show("Response \"" + e.Response + "\" receieved.", "LocalMessageSender", MessageBoxButton.OK); }
VB
' In the sending application: Private Sub SendMessage(ByVal messageSender As LocalMessageSender) MessageBox.Show("Sending message ""message"".", _ "LocalMessageSender", MessageBoxButton.OK) messageSender.SendAsync("message") End Sub ' In the receiving application: Private Sub receiver_MessageReceived(ByVal sender As Object, _ ByVal e As MessageReceivedEventArgs) MessageBox.Show("Message """ & e.Message & _ """ received. Sending response ""response"".", _ "LocalMessageReceiver", MessageBoxButton.OK) e.Response = "response" End Sub ' In the sending application: Private Sub sender_SendCompleted(ByVal sender As Object, _ ByVal e As SendCompletedEventArgs) MessageBox.Show("Response """ & e.Response & """ receieved.", _ "LocalMessageSender", MessageBoxButton.OK) End Sub
发送器无需处理 SendCompleted 事件。但如果需要,则无论是否已成功接收消息,并且无论接收器是 否已发送响应,该事件都会发生。但是,如果未接收该消息,则 AsyncCompletedEventArgs.Error 属性 (由 SendCompletedEventArgs 类继承)将被设置为 SendFailedException 实例。例如,如果指定的接 收器名称尚未注册,或者接收器未配置为从发送器的域接收消息,就可能会发生上述情况。