C# DateTime.UtcNow 值始终更新

C# DateTime.UtcNow value always updated

我有一个 class 应该跟踪上次访问它的时间,我有一个 public 属性 公开最后一次访问时间值,该值是私下设置的。

我的class定义如下:

internal class DeviceModelCacheItem
{
    private int _cacheId;
    private List<DeviceModel> _deviceModels;
    private DateTime _lastAccess;

    public DeviceModelCacheItem(int cacheId, List<DeviceModel> deviceModels)
    {
        _cacheId = cacheId;
        _deviceModels = deviceModels;
        _lastAccess = DateTime.UtcNow;
    }

    ...

    public List<DeviceModel> DeviceModels
    {
        get
        {
            _lastAccess = DateTime.UtcNow;
            return _deviceModels;
        }
        set
        {
            _lastAccess = DateTime.UtcNow;
            _deviceModels = value;
        }
    }

    public DateTime LastAccess
    {
        get
        {
            return _lastAccess;
        }
    }
}

我在单独的 class 方法中访问此值,如下所示:

var cacheItem = _deviceModelCache.SingleOrDefault(x => x.CacheId == deviceTypeId);

if(cacheItem != null && DateTime.UtcNow.Subtract(cacheItem.LastAccess).TotalSeconds > 120)
{
    ...
}

其中 _deviceModelCache 是 DeviceModelCacheItem 实例的集合。

我发现每当我尝试访问此值时,私有值将始终更新,因此无法将其用作跟踪值。为什么要更新?

编辑

我包含了更多代码来展示我如何访问 DateTime 值。 DeviceModelCacheItem 实例的集合保存在一个单例中,如下所示:

编辑 2

我还添加了数据库访问代码,还包括我更新 _lastAccess 的地方 属性。我想我可能有延迟执行问题。

public class DeviceModelRepository
{
    private List<DeviceModelCacheItem> _deviceModelCache;        

    private static readonly Lazy<DeviceModelRepository> instance = new Lazy<DeviceModelRepository>(() => new DeviceModelRepository());

    public static DeviceModelRepository Instance
    {
        get
        {
            return instance.Value;
        }
    }

    private DeviceModelRepository()
    {
        _deviceModelCache = new List<DeviceModelCacheItem>();
    }

    public IEnumerable<DeviceModel> GetAllDeviceModelsByDeviceTypeId(int deviceTypeId)
    {
        return GetAllDeviceModelsByDeviceTypeId(GlobalConfiguration.APP_CACHE_ENABLED, deviceTypeId);
    }

    private IEnumerable<DeviceModel> GetAllDeviceModelsByDeviceTypeId(bool enableCache, int deviceTypeId)
    {
        var cacheItem = _deviceModelCache.SingleOrDefault(x => x.CacheId == deviceTypeId);

        //Debugger attached here
        if(cacheItem != null && DateTime.UtcNow.Subtract(cacheItem.LastAccess).TotalSeconds > 120)
        {
            ... 
            using (GadgetContext db = new GadgetContext())
            {
                var deviceModels = db.DeviceModels.Where(x => x.DeviceTypeId == deviceTypeId).ToList();

                if (enableCache && deviceModels != null && deviceModels.Count > 0)
                {
                    try
                    {
                        if(cacheItem == null)
                        {
                            _deviceModelCache.Add(new DeviceModelCacheItem(deviceTypeId, deviceModels));
                        }
                        else
                        {
                            cacheItem.DeviceModels = deviceModels;
                        }
                    catch (Exception ex)
                    {
                        System.Diagnostics.Trace.WriteLine(ex.ToString());
                    }
               }
            }
            ...
        }
        ...
    }
}

正如@JamesLucas 所指出的,DateTime.UtcNow 值总是被更新的问题归结为我的代码中的延迟执行错误。每次 entity framework 延迟执行以从数据库中获取项目时,我的日期时间值都会更新。