本地消息传递系统实现指南

在某些特定的业务场景中,可能需要在本地应用之间进行消息传递。这种情况下,本地消息传递机制就显得尤为重要。本文将通过一个简单的Silverlight应用程序示例,介绍如何实现本地消息传递系统。这个示例包括一个发送者项目和一个接收者项目。文章末尾附有演示,以便更直观地理解实现过程。

创建项目结构

首先,需要为示例应用程序创建项目结构。在这个示例中,将创建两个不同的Silverlight项目,分别命名为“Sender”和“Receiver”。Sender项目将广播消息,而Receiver项目将捕获该消息并执行相应的操作。以下是项目结构的参考图:

创建发送者UI

接下来,将创建发送者应用程序的用户界面。在这个界面中,将提供几个单选按钮以选择不同的颜色,以及一个按钮,允许用户提交消息进行广播。以下是XAML代码:

<Grid x:Name="LayoutRoot" Background="White"> <StackPanel> <RadioButton x:Name="rdoRed" GroupName="color" Content="Red" /> <RadioButton x:Name="rdoGreen" GroupName="color" Content="Green" /> <RadioButton x:Name="rdoBlue" GroupName="color" Content="Blue" /> <RadioButton x:Name="rdoYellow" GroupName="color" Content="Yellow" /> <Button Content="Send" Height="26" Width="150" Click="SendButtonClick" /> </StackPanel> </Grid>

这将在用户界面中呈现如下效果:

实现消息广播

现在是时候将消息发送给接收者应用程序了。为此,有一个名为LocalMessageSender的类,它位于System.Windows.Messaging命名空间下,其构造函数需要接收者名称和接收者域作为参数:

public LocalMessageSender(string receiverName, string receiverDomain);

在按钮点击事件中,将检查哪个颜色被选中,然后创建LocalMessageSender类的实例,并将适当的颜色作为消息传递给SendAsync()方法,如下所示:

private void SendButtonClick(object sender, RoutedEventArgs e) { var rdoRedSelected = rdoRed.IsChecked == true; var rdoGreenSelected = rdoGreen.IsChecked == true; var rdoBlueSelected = rdoBlue.IsChecked == true; var rdoYellowSelected = rdoYellow.IsChecked == true; var localMessageSender = new LocalMessageSender("myMessagingDemo", LocalMessageSender.Global); localMessageSender.SendAsync(rdoRedSelected ? "Red" : rdoGreenSelected ? "Green" : rdoBlueSelected ? "Blue" : rdoYellowSelected ? "Yellow" : "White"); }

SendAsync()方法有一个完成事件(SendCompleted),可以在其中检查ReceiverName、ReceiverDomain、Message和Response(如果有的话)。

实现消息接收

与LocalMessageSender类似,还有一个名为LocalMessageReceiver的类,它位于相同的命名空间System.Windows.Messaging下。它的构造函数需要接收者名称、接收者名称范围和允许的发送者域作为参数:

public LocalMessageReceiver(string receiverName, ReceiverNameScope nameScope, IEnumerable allowedSenderDomains);

在接收者项目的页面加载事件中,将创建LocalMessageReceiver的实例,注册MessageReceived事件,然后调用Listen()方法开始监听消息:

void MainPageLoaded(object sender, RoutedEventArgs e) { var localMessageReceiver = new LocalMessageReceiver("myMessagingDemo", ReceiverNameScope.Global, LocalMessageReceiver.AnyDomain); localMessageReceiver.MessageReceived += LocalMessageReceiverMessageReceived; localMessageReceiver.Listen(); }

在消息接收事件的实现中,将检查消息的类型,并根据接收到的消息执行相应的操作。在示例中,将根据接收到的颜色信息,改变接收者应用程序LayoutRoot网格的背景颜色:

void LocalMessageReceiverMessageReceived(object sender, MessageReceivedEventArgs e) { var message = e.Message; switch (message) { case "Red": LayoutRoot.Background = new SolidColorBrush(Colors.Red); break; case "Green": LayoutRoot.Background = new SolidColorBrush(Colors.Green); break; case "Blue": LayoutRoot.Background = new SolidColorBrush(Colors.Blue); break; case "Yellow": LayoutRoot.Background = new SolidColorBrush(Colors.Yellow); break; default: LayoutRoot.Background = new SolidColorBrush(Colors.White); break; } }

以上就是实现部分的全部内容。接下来,让看看它在实际操作中的表现。

演示

让运行应用程序。由于有两个项目,需要分别运行它们。运行后,将有两个浏览器窗口,一个作为Sender应用程序,另一个作为Receiver应用程序。默认情况下,接收者将有白色背景。现在转到发送者应用程序,选择任意一个单选按钮以选择颜色。然后点击"Send"按钮,将颜色消息发送到另一个Silverlight应用程序。接收者应用程序将根据名称捕获消息,并相应地改变布局的颜色。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485