ConcurrentDictionary TryUpdate средство сравнения равенства
У меня есть ConcurrentDictionary, который я использую в качестве хэш-таблицы, которая будет обновляться через регулярные промежутки времени. TValue моего ConcurrentDictionary - это пользовательский класс, который я создал:
public class RefreshableDictionaryValue<TValue>
{
private DateTime lastRefreshed;
private DateTime lastAccessed;
private TValue value;
public override bool Equals(object obj)
{
if (obj == null)
{
return false;
}
TValue t = (TValue)obj;
if((System.Object)t == null)
{
return false;
}
return this.Value.Equals(((RefreshableDictionaryValue<TValue>)obj).Value);
}
public override int GetHashCode()
{
return Value.GetHashCode();
}
...
}
Я предполагаю, что ConcurrentDictionary использует equals для сравнения значений двух объектов, и я переопределил Equals для моего класса, чтобы он возвращал true, если значения TValues равны. Даты могут быть разными. Я также пытался инериринг от IEqualityComparer<RefreshableDictionaryValue<TValue>>
но это не имело никакого эффекта.
Если я не переопределяю Equals, тогда TryUpdate возвращает false (очевидно, потому что объекты, которые я сравниваю, будут иметь одинаковое TValue, но разные даты), и если я переопределяю equals, я получаю эту ошибку
> Error while refreshing dictionary System.InvalidCastException: Unable
> to cast object of type
> ItemRefreshableDictionary.RefreshableDictionaryValue`1[StatsHelper.Stats]'
> to type 'StatsHelper.Stats'. at
> ItemRefreshableDictionary.RefreshableDictionaryValue`1.Equals(Object
> obj) in
> \Projects\StatsHelper\ItemLevelRefreshableDictionary\ItemLevelRefreshableDictionary.cs:line
> 24 at System.Collections.Generic.ObjectEqualityComparer`1.Equals(T
> x, T y) at
> System.Collections.Concurrent.ConcurrentDictionary`2.TryUpdate(TKey
> key, T Value newValue, TValue comparisonValue)
Изменить: Вот как я делаю обновление:
foreach(KeyValuePair<TKey, RefreshableDictionaryValue<TValue>> entry in cacheDictionary)
{
DateTime lastRefresh = entry.Value.LastRefreshed;
DateTime lastAccess = entry.Value.LastAccessed;
secondsSinceLastRefresh = Convert.ToInt32((DateTime.Now - lastRefresh).TotalSeconds);
secondsSinceLastAccess = Convert.ToInt32((DateTime.Now - lastAccess).TotalSeconds);
if (secondsSinceLastAccess < cacheExpirationTime)
{
if (secondsSinceLastRefresh > refreshInterval)
{
TValue updatedValue = valueGetter(entry.Key);
bool s = cacheDictionary.TryUpdate(entry.Key, new RefreshableDictionaryValue<TValue>(DateTime.Now, lastAccess, updatedValue), entry.Value);
}
}
}