我有一个基于轮询的协议,我想利用 RX 将其转换为基于推送的协议。每隔 x 秒,我使用协议请求标签(名称和值),然后我从中取回它们。
我只对更改标签中的值感兴趣,所以我使用 DistinctUntilChanges 函数。
this.TagsChangeNotifier = _tags
.Select(tag =>
{
return Observable
.Interval(ts)
.Select(_ => { return tag; })
.DistinctUntilChanged(new DataTagComparer());
})
.Merge();
这是 DataTagcomparer 类。
public class DataTagComparer : IEqualityComparer<DataTag>
{
public bool Equals(DataTag x, DataTag y)
{
b = y.WeakRawValue.ToByteArray().SequenceEqual(x.WeakRawValue.ToByteArray());
return b;
}
public int GetHashCode(DataTag obj)
{
return obj.Name.GetHashCode();
}
}
但看起来无法工作,因为我永远看不到两个不同值之间的比较。这是一个例子。
Start program: DataTag("Test",1)
Equals called: x = ("Test",1), y = ("Test",1)
等待 10 秒,然后从协议更改为返回 2 而不是 1。
Equals called: x = ("Test",1), y = ("Test",1)
Equals called: x = ("Test",2), y = ("Test",2)
Equals called: x = ("Test",2), y = ("Test",2)
Equals called: x = ("Test",2), y = ("Test",2)
等等。
奇怪的是,它完全没有以前值和当前值之间的比较!你知道可能是什么问题吗?实际上我正在使用这个可怕的解决方法
public class DataTagComparer : IEqualityComparer<DataTag>
{
private object val;
public bool Equals(DataTag x, DataTag y)
{
bool b = true;
if (val != null)
b = val.ToByteArray().SequenceEqual(x.WeakRawValue.ToByteArray());
val = x.WeakRawValue;
return b;
}
public int GetHashCode(DataTag obj)
{
return obj.Name.GetHashCode();
}
}
谢谢你的关注,文森佐。
编辑:DataTag 类代码
public abstract class DataTag
{
public DataTag(string _Name, string Desc)
{
Name = _Name;
Description = Desc;
}
public string Name { get; private set; }
public string Description { get; private set; }
public abstract object WeakValue { get; }
public abstract object WeakRawValue { get; }
}
编辑:标签更新功能
this.timerHandle = Observable.Interval(ts).Select(_ => { Update(); return _; }).Publish().Connect();