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);
        }
     }
 }

0 ответов

Другие вопросы по тегам