在进程间通信中,我有一个 PipeServer 进程,它启动一个 NamedPipe 和其他一些连接到该进程的客户端,并且有一些消息协议要处理。
在某些情况下,我想将消息从服务器发送到一个客户端。那么,有没有办法在连接到服务器时为每个客户端注册一个名称?
在进程间通信中,我有一个 PipeServer 进程,它启动一个 NamedPipe 和其他一些连接到该进程的客户端,并且有一些消息协议要处理。
在某些情况下,我想将消息从服务器发送到一个客户端。那么,有没有办法在连接到服务器时为每个客户端注册一个名称?
您可以使用基于列表的发布订阅模式。您需要做的是修改订阅调用以包含客户端 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());
}