Сравнение результата длительной задачи с предыдущим результатом - PullRequest
0 голосов
/ 21 февраля 2012

У меня есть веб-сервис, который возвращает сложную структуру данных, представляющую результаты интенсивного процесса.Чтобы сделать службу отзывчивой, процесс запускается в асинхронной задаче.

При первом вызове службы возвращается пустая структура данных и запускается задача.Последующие сервисные вызовы возвращают кэшированные данные до тех пор, пока Задача не будет выполнена.Когда закончите, мне нужно определить, действительно ли результаты изменились.Если это так, я обновляю свойство, которое указывает дату / время обновления результатов, и сбрасываю кэшированные данные, чтобы новая структура возвращалась службой.В какой-то момент в будущем, по ряду причин, задача будет перезапущена, и логика повторяется.

Я ищу наиболее эффективный способ определить, изменились ли результаты из «кэшированных» данных,Простейшим было бы реализовать Equals для каждого объекта в структуре с равенством родителей, основанным на равенстве их детей и т. Д., Поэтому вызов Equals для корневых объектов даст желаемый результат, но это требует сканирования всей структуры, и я не уверенэто лучший подход.

Я также подумал о том, чтобы начать с копии оригинала и использовать флаги IsDirty, чтобы указать, что объект в структуре изменился, но беспокоился о том, что операция копирования может свести на нет любые преимущества выполнения..

Какой подход вы бы использовали (и почему)?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2012

Предполагая, что вы предоставили оператор равенства для вашего объекта данных, вы можете просто проверить, что они равны.

Например:

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: проверка безопасности потока исключена.

0 голосов
/ 21 февраля 2012

Я бы создал статический метод, который рекурсивно обходит все свойства 2 экземпляров (слева и справа), которыми необязательно можно управлять с помощью атрибутов, и вызывает метод equals слева направо. Когда одно из свойств указывает на неравенство, мы знаем, что эти 2 случая различны. Это позволяет мне реализовать минимальный объем кода для сравнения, но при этом полностью контролировать то, что сравнивается и как сравнивается (помечая определенные свойства новым атрибутом, таким как [NoCompare], и ​​реализуя собственную логику равенства).

...