Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# System.Runtime.Cache是否未过期?_C#_.net_Caching - Fatal编程技术网

C# System.Runtime.Cache是否未过期?

C# System.Runtime.Cache是否未过期?,c#,.net,caching,C#,.net,Caching,我在ASP.NET项目中实现了一个解决方案,可以根据时间自动发送一些电子邮件。我通过使用System.Runtime.Cache,特别是CacheItemRemovedCallback来实现这一点。首先,我将任务添加到应用程序启动方法中的缓存中: protected void Application_Start(object sender, EventArgs e) { ... AddTask(reportElement.name, totalMinutes); ...

我在ASP.NET项目中实现了一个解决方案,可以根据时间自动发送一些电子邮件。我通过使用System.Runtime.Cache,特别是CacheItemRemovedCallback来实现这一点。首先,我将任务添加到应用程序启动方法中的缓存中:

protected void Application_Start(object sender, EventArgs e)
{
    ...
    AddTask(reportElement.name, totalMinutes);
    ...
}
然后AddTask方法将该项添加到缓存中:

private void AddTask(string name, int minutes)
{
    OnCacheRemove = new CacheItemRemovedCallback(CacheItemRemoved);
    HttpRuntime.Cache.Insert(name, minutes, null, DateTime.Now.AddMinutes(minutes),     Cache.NoSlidingExpiration,
            CacheItemPriority.NotRemovable, OnCacheRemove);
}
因此,当缓存项在AbsolutionExption中指定的分钟后过期时,它将调用我的CacheItemRemoved方法。这基本上是运行一个报告,发送一封电子邮件,然后将任务重新添加到缓存中,因此它将在时间再次过期后再次运行-很简单。下面是我们在CacheItemRemoved中关注的部分代码

public void CacheItemRemoved(string taskName, object minutes, CacheItemRemovedReason r)
{
    ...
    finally
    {
        AddTask(taskName, Convert.ToInt32(minutes));
    }
    ...
}
代码中有异常处理,正如您可以看到的,任务的重新添加在finally块中,因此应该总是被调用。所有异常捕获块所做的就是将错误记录到文件中,因为我希望即使前一个任务失败也能保持任务运行

这在我的本地机器上运行得很好,但在WindowsServer2003上,它基本上只运行一次。我添加了额外的调试,看起来第二次添加缓存项时,它根本不会过期。我现在完全卡住了。windows服务器正在运行IIS 6.0。是否有我不知道的缓存设置。此外,在服务器上,它似乎在与分钟中指定的时间完全不同的时间过期

提前谢谢

HttpRuntime.Cache.Insert(name, minutes, null, DateTime.Now.AddMinutes(minutes),     Cache.NoSlidingExpiration,
            CacheItemPriority.NotRemovable, OnCacheRemove);

添加缓存项时,为什么要指定CacheItemPriority.NotRemovable,这肯定会阻止删除该项(除非内存不足)

根据Microsoft的说法:当服务器释放系统内存时,具有此优先级的缓存项不会自动从缓存中删除。但是,根据项目的绝对或滑动过期时间,具有此优先级的项目将与其他项目一起删除。