2014-10-21 33 views
0

在我的生产服务器上,我有一个使用频繁的SQL Server实例和我的应用程序,它是一个c#Windows服务。我的服务在不同的时间运行各种工作。每24小时发送一封电子邮件,提供有关各种工作进展的最新信息。MemoryCache意外驱逐在C#

该代码通过检查内存缓存中的标志来确定是否发送电子邮件。代码如下所示: -

if (Common.MemCache.Get(Common.MemoryCacheActions.DailyEmail) == null) 
{ 
    Common.Logger.Info("Collating email data."); 
    Common.MemCache.Add(Common.MemoryCacheActions.DailyEmail, String.Empty, DateTime.Now.AddHours(24)); 

    SendEmail(); 
} 

由于我的主循环检查每分钟左右,我已经收到了大量电子邮件的空项。这就好像添加失败了,或者该项目已被驱逐?

我已经阅读过在没有足够内存的情况下可能会被驱逐的地方。正如在发生这种情况时发生的那样,维护脚本在SQL Server中运行,并且盒子上的可用内存几乎为零。我关闭了我在服务器上运行的几个程序,chrome,SSMS等,并且没有更多的日志条目或电子邮件。

由于我已明确设置项目的到期时间为现在+ 24小时,因此我希望它可以在24小时内添加项目!

这里有什么解决方案,我必须将CacheItemPriority设置为NotRemoveable,然后在24小时后手动删除项目吗?

这种类型打败了我如何使用我的缓存,或将不可拆卸与AbsoluteExpirationDate协同工作?

回答

1

您可以使用

MemoryCache.CreateCacheEntryChangeMonitor()

创建CacheEntryChangeMonitor对象,可以触发事件以响应更改指定缓存条目。

查看相关项目是否从缓存中删除。

该方法返回一个CacheEntryChangeMonitor实例,其中的NotifyOnChanged方法用于提供缓存更改时调用的回调方法。

此外,请验证您的服务没有重新启动。也许它崩溃并设置为在崩溃时重新启动?

0

我认为,所描述的行为是正确的 - 没有任何合同或定义说该项目无法随时从缓存中清除。

要每24小时安排一次电子邮件是恕我直言,好得多使用例如https://www.quartz-scheduler.net/或您选择的任何其他调度库。

这将清楚地显示您的意图。