服务器给客户端发送消息,如果一直发送A消息,那客户端只收到第一次A消息,再收到A消息就自动屏蔽,如果服务器又发送了B消息,客户端判断B消息与A消息不一样,就让B消息替换A消息,执行B消息,如果再接收B消息,依次循环,得怎么办?
做一个临时缓存 只存储当前的数据 每次有数据过来就对比下
你把消息存个地方,判断不就行了,还能怎么办
你都说要判定,所以问题很简单,那就是判定依据。在C#里就是自己实现IEqualityComparer比较接口
置于剩下的事情,你是想入上面一样搞个临时变量还是想直接使用Rx.net 的Distinct方法自己选
抛出IEqualityCompare接口实现不管,我可以展示一下Rx.net 的效果(因为我不知道你如何确定A和B是不同消息规则,所以我也不打算实现他,我就用已经内置比较器的int做演示)
nuget:System.Reactive
//rx的一个中间上下文对象
Subject<int> source = new Subject<int>();
//为了展示效果,我先订阅原始数据
source.Subscribe(p =>
{
Console.WriteLine($"原始消息:{p}");
});
//此处我过滤所有已经出现的,当然这种方式会需要消耗内存,我没看内部算法,但不外乎hash表,布隆过滤器,如果你一定需要如此我也没办法(或许可以依靠时间依赖缓存,毕竟我们一般只需要比较10分钟内,不需要保证100天内不重复的)
source.Distinct().Subscribe(p =>
{
//
Console.WriteLine($"全过滤的消息:{p}");
});
//下面这个是我建议使用的,仅仅过滤连续重复的
source.DistinctUntilChanged().Subscribe(p =>
{
//
Console.WriteLine($"连续重复过滤的消息:{p}");
});
//使用一个任务模拟你服务器发送的过程,每隔一秒从队列里拿一条数据发出去
//当然你看到数据会有连续重复数据
Task.Run(async () =>
{
Queue Queque = new Queue(new List<int> { 1, 2, 3, 3, 3, 4, 1, 3, 3, 2, 2 });
//
while (Queque.Count>0)
{
source.OnNext((int)Queque.Dequeue());
await Task.Delay(1000);
}
});