C# Asp.Net-具有CacheUpdateCallback的缓存的绝对过期时间是否可以小于20秒?

C# Asp.Net-具有CacheUpdateCallback的缓存的绝对过期时间是否可以小于20秒?,c#,asp.net,caching,delegates,C#,Asp.net,Caching,Delegates,我有下面详述的测试线束。页面上有两个标签,它们是在页面加载中设置的,由于updatepanel和计时器,页面加载每秒都会被点击 Label1设置为存储在缓存中的日期时间值。Label2设置为当前日期时间 缓存设置为从现在起5秒的绝对过期时间,并且缓存上有一个更新回调来重新设置日期时间并使其在另外5秒内有效 我遇到的问题是,缓存每20秒更新一次,而不是像我预期的那样每5秒更新一次。如果我将时间设置为30秒,那么它每40秒更新一次 这似乎表明缓存将仅每20秒过期一次。有人知道减少这一次的方法吗?如果

我有下面详述的测试线束。页面上有两个标签,它们是在页面加载中设置的,由于updatepanel和计时器,页面加载每秒都会被点击

Label1设置为存储在缓存中的日期时间值。Label2设置为当前日期时间

缓存设置为从现在起5秒的绝对过期时间,并且缓存上有一个更新回调来重新设置日期时间并使其在另外5秒内有效

我遇到的问题是,缓存每20秒更新一次,而不是像我预期的那样每5秒更新一次。如果我将时间设置为30秒,那么它每40秒更新一次

这似乎表明缓存将仅每20秒过期一次。有人知道减少这一次的方法吗?如果我只是插入到缓存中,过期时间为5秒,并且没有回调,那么它会像我预期的那样工作,并且每5秒被删除一次

ASPX:


您发布的代码的一个问题是,您正在将
DateTime
放入回调方法中的缓存中,但在页面加载中检查
null

尽管如此,这不是问题所在。在使用Reflector快速查看之后,它看起来像是缓存实现的一个怪癖:当您使用回调时,它是从每20秒运行一次的计时器调用的

我推测原因是与重返大气层有关。没有任何东西可以阻止您从回调方法中访问缓存。在试图删除某个项目的过程中这样做可能不安全(例如,如果您试图访问在删除过程中的缓存项,则可能存在一个无限循环)。p>
因此,当您有一个回调时,实现会推迟删除缓存项,直到其计时器运行。

将其声明为可空的唯一原因是使其与缓存一起工作。它仍然完全能够将datetime转换为可为空的datetime。我将发布一个更新,将null转换为minvalue,以避免任何混淆。
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="CacheTest.aspx.cs" Inherits="CacheTest" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Cache Test</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:ScriptManager ID="ScriptManager1" runat="server" />
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                <asp:Label ID="Label1" runat="server" Text="" />
                <br />
                <asp:Label ID="Label2" runat="server" Text="" />
                <asp:Timer ID="Timer1" Interval="1000" runat="server" />
            </ContentTemplate>
        </asp:UpdatePanel>
    </div>
    </form>
</body>
</html>
using System;
using System.Web;
using System.Web.Caching;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class CacheTest : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        DateTime CachedDateTime = (DateTime)(Cache["DateTime"] ?? DateTime.MinValue);
        if (CachedDateTime == DateTime.MinValue)
        {
            CachedDateTime = System.DateTime.Now;
            Cache.Insert("DateTime", CachedDateTime, null, DateTime.Now.AddSeconds(5), Cache.NoSlidingExpiration, CacheDateTimeUpdateCallback);
        }
        Label1.Text = CachedDateTime.ToString();
        Label2.Text = DateTime.Now.ToString();
    }

    private void CacheDateTimeUpdateCallback(string key, CacheItemUpdateReason cacheItemUpdateReason, out object value, out CacheDependency dependencies, out DateTime absoluteExipriation, out TimeSpan slidingExpiration)
    {
        value = System.DateTime.Now;
        dependencies = null;
        absoluteExipriation = DateTime.Now.AddSeconds(5);
        slidingExpiration = Cache.NoSlidingExpiration;
    }
}