我有一个Web服务,它返回一个表示密集过程结果的复杂数据结构。为了使服务响应,该过程在异步任务中运行。
第一次调用服务时,将返回一个空数据结构并启动任务。后续服务调用将返回缓存的数据,直到任务完成。完成后,我需要确定结果是否实际发生了变化。如果是,我更新一个属性,指示结果更新的日期/时间,并重置缓存的数据,以便服务返回新的结构。在未来的某个时刻,基于各种原因,重新启动任务并重复逻辑。
我正在寻找确定结果是否已从“缓存”数据更改的最有效方法。最简单的方法是在结构中的每个对象上实现Equals,父级基于子级的相等性等等。因此在根对象上调用Equals会产生所需的结果,但这需要爬行整个结构,我不确定这是最好的方法。
我还考虑过从原始副本开始并使用'IsDirty'标志来指示结构中的对象已更改但担心复制操作可能会否定任何表现好处。
您会使用什么方法(以及为什么)?
答案 0 :(得分:0)
我将创建一个静态方法,以递归方式遍历2个实例(左侧和右侧)的所有属性,可以选择使用属性进行控制,并调用左侧的equals方法。当其中一个属性表明不平等时,我们知道2个实例是不同的。这允许我实现最少量的代码用于比较,同时完全控制比较内容和比较方式(通过使用[NoCompare]等新属性标记某些属性并实现自定义相等逻辑)。
答案 1 :(得分:0)
假设您已为数据对象提供了equals运算符,您应该只需检查它们是否相等。
例如:
class CacheEntry<TCacheItem>
{
TCacheItem item;
DateTime? lastUpated;
}
class MyItem
{
int Id;
string Foo;
public bool Equals(MyItem b)
{
return this.Id == b.Id && this.Foo == b.Foo; // or something like this...
}
}
然后当你得到你的结果时:
CacheEntry<MyItem> cacheEntry = ...;
MyItem newItem = ...;
if (cacheEntry.Item != newItem)
{
cacheEntry.item = newItem;
cacheEntry.lastUpdated = DateTime.UtcNow;
}
nb:线程安全检查遗漏了。