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

运行在同一台电脑上的多个 Silverlight 应用程序可以通过本地消息进行通信,通信是在客户端进行的,不需要与服务端交互。使用这一功能可以使在同一页面承载的多个 Silverlight 应用程序之间或不同页面承载的 Silverlight 应用程序之间进行通信,在网页上承载的 Silverlight 应用程序也可以和运行在浏览器外的其他应用程序之间进行通信。

要在 Silverlight 应用程序之间的通信,需要建一个信息发送程序和一个信息接收程序,发送端使用 LocalMessageSender 来发送信息,接收端使用 LocalMessageReceiver 来接收信息。

信息发送端:

创建发送端时需要提供一个接收端的名称,同时也可以限定接收端所在的域,如果不提供接收端的域默认为 Global 。

public class MainViewModel : ViewModelBase
{
    private LocalMessageSender messageSender;
    private const int MAXRETRY = 10;
    private int retry = 1;

    public string SendResult
    {
        get;
        private set;
    }

    /// <summary>
    /// Initializes a new instance of the MainViewModel class.
    /// </summary>
    public MainViewModel()
    {
        SendMessageCommand = new RelayCommand<string>(SendMessage);
        messageSender = new LocalMessageSender("receiver1");
        messageSender.SendCompleted += new System.EventHandler<SendCompletedEventArgs>(messageSender_SendCompleted);
    }

    private void messageSender_SendCompleted(object sender, SendCompletedEventArgs e)
    {
        if (e.Error != null)
        {
            if (retry > MAXRETRY)
            {
                SendResult = "Could not send message.";
                RaisePropertyChanged("SendResult");
                return;
            }
            else
            {
                retry++;
                SendMessage(e.Message);
            }
        }
        else
        {
            retry = 1;
            SendResult = string.Concat(e.ReceiverName,":", e.Response);
            RaisePropertyChanged("SendResult");
        }
    }
        
    public RelayCommand<string> SendMessageCommand { get; private set; }
    private void SendMessage(string msg)
    {
        messageSender.SendAsync(msg);
    }
}

使用 SendAsync 方法来发送信息,当信息发送成功时引发 SendCompleted 事件,可以通过 SendCompletedEventArgs 的 Response 属性来获取从接收端返回的信息,当信息发送失败时会抛出 SendFailedException ,可以通过 SendCompletedEventArgs 的 Error 属性来获取。

信息接收端:

创建接收端时需要指定接收端的名称,同时也可以限定该名称的范围是限定为全局名称范围还是限定为接收方的特定域和限定接收方可从中接收消息的域。接收端的名称必须在全局范围内唯一,或者在接收端的宿主域内唯一。

public class MainViewModel : ViewModelBase
{
    private LocalMessageReceiver messageReceiver;

    public string Message
    {
        get;
        private set;
    }

    /// <summary>
    /// Initializes a new instance of the MainViewModel class.
    /// </summary>
    public MainViewModel()
    {
        messageReceiver = new LocalMessageReceiver("receiver1");
        messageReceiver.MessageReceived += new System.EventHandler<MessageReceivedEventArgs>(messageReceiver_MessageReceived);
        try
        {
            messageReceiver.Listen();
        }
        catch (ListenFailedException e)
        {
            Message = e.Message;
            RaisePropertyChanged("Message");
        }
    }

    private void messageReceiver_MessageReceived(object sender, MessageReceivedEventArgs e)
    {
        e.Response = "Message received.";
        Message = e.Message;
        RaisePropertyChanged("Message");
    }
}

接收端通过 Listen 方法监听信息,当收到信息时引发 MessageReceived 事件,可以通过 MessageReceivedEventArgs 的 Message 属性来获取接收到的信息,同时可以设置 MessageReceivedEventArgs 的 Response 属性给发送端返回一个信息。

示例代码下载:SLCommunication

posted @ 2011-06-30 23:55  forgetu  阅读(2767)  评论(6编辑  收藏  举报