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 延迟执行以从数据库中获取项目时,我的日期时间值都会更新。
我有一个 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 延迟执行以从数据库中获取项目时,我的日期时间值都会更新。