0

在进程间通信中,我有一个 PipeServer 进程,它启动一个 NamedPipe 和其他一些连接到该进程的客户端,并且有一些消息协议要处理。

在某些情况下,我想将消息从服​​务器发送到一个客户端。那么,有没有办法在连接到服务器时为每个客户端注册一个名称?

4

1 回答 1

1

您可以使用基于列表的发布订阅模式。您需要做的是修改订阅调用以包含客户端 ID,然后将其存储在一个列表中,当您想向特定客户端宣布时,只需获取列表元素并使用回调。下面的边缘周围的东西:

    public interface ISampleClientContract
    {
        [OperationContract(IsOneWay = true)]
        void AnnounceSomeStuff();
    }

    public class Subscriber
    {
        public ISampleClientContract Callback { get; set; }
        public Guid ID { get; set; }
    }

    private List<Subscriber> MyClients = new List<Subscriber>();

    public void Subscribe(Guid id)
    {
        MyClients.Add(new Subscriber
            { 
                Callback = OperationContext.Current.GetCallbackChannel<ISampleClientContract>()
                ID = id
            });
    }

    public void Unsubscribe(Guid ID)
    {
        MyClients.Remove(o => o.ID == id).First());
    }

    public void NotifyClient(Guid id)
    {
        try
        {
            MyClients.Where( o => o.ID == id).First().Callback.AnnounceSomeStuff();
        }
        catch
        {
            MyClients.Remove(MyClients.Where(o => o.ID == id).first()); //instance dead?
        }
    }

    public void AnnounceToAll()
    {
        MyClients.ForEach(o => o.Callback.AnnounceSomeStuff());
    }
于 2013-09-19T07:18:26.127 回答