none
使用Cache.Insert时候遇到一个问题 RRS feed

  • 问题

  • 代码如下:
            protected void Button1_Click(object sender, EventArgs e)
            {
                Cache.Insert("a", DateTime.Now.AddMilliseconds(10000)
                    , null, DateTime.Now.AddMilliseconds(10000),
                    System.Web.Caching.Cache.NoSlidingExpiration,
                    System.Web.Caching.CacheItemPriority.Default,
                        new System.Web.Caching.CacheItemRemovedCallback(DeleteCallBack));
            }
            private void DeleteCallBack(string key, object objvalue, System.Web.Caching.CacheItemRemovedReason reason)
            {
                string str1 = objvalue.ToString(); //2009/8/6 23:46:34 下午
                string str2 = DateTime.Now.ToString(); //2009/8/6 23:46:47 下午
            }
    在下面这个回调函数中。我输出了插入时的时间:str1 。运行回调函数的时间:str2
    我明明指定的是10秒后缓存过期。那么应该是10s后运行回调函数。应该是str1 = str2。但是实际情况却相差了13s。为什么?
    郭鹏
    2009年8月6日 15:53

答案

  • 你好,

    NoSlidingExpiration可以设置相对过期时间,如果缓存在NoSlidingExpiration设定的时间内没有被访问,缓存过期,如果在这段时间内有访问,则缓存过期时间将会重置为原始值,如NoSlidingExpiration=20

    在20分钟内如果没有被访问,缓存过期,如果每次19分钟访问缓存,缓存将永远不会过期。
    jon.valett@gmail.com
    • 已标记为答案 Hugo12345 2009年8月6日 17:24
    • 取消答案标记 Hugo12345 2009年8月6日 17:24
    • 已标记为答案 KeFang Chen 2009年8月10日 3:03
    2009年8月6日 17:18
    版主
  • 你好设置NoSlidingExpiration以禁用可调过期,即是说将插入缓存的方法的参数中的slidingExpiration 参数设置成 TimeSpan.Zero 字段

    关于slidingExpiration:最后一次访问所插入对象时与该对象过期时之间的时间间隔。如果该值等效于 20 分钟,则对象在最后一次被访问 20 分钟之后将过期并被从缓存中移除

    你这里的情况设置NoSlidingExpiration后,其实相当于10s后就过期无论客户端是否在这段时间内访问

    但是实际上是13s这可能是由于一些计时器的误差导致的,因为Timer并不是那样精确的

    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    2009年8月7日 1:58
    版主
  • DateTime.UtcNow.AddMilliseconds(10000)
    【孟子E章】
    2009年8月7日 5:28
    版主
  • 您好,windows不是实时操作系统,每个线程的cpu时间是由windows来调度和分配的。
    达不到精确的要求。
    2009年8月7日 8:10
    版主

全部回复

  • 你好,

    NoSlidingExpiration可以设置相对过期时间,如果缓存在NoSlidingExpiration设定的时间内没有被访问,缓存过期,如果在这段时间内有访问,则缓存过期时间将会重置为原始值,如NoSlidingExpiration=20

    在20分钟内如果没有被访问,缓存过期,如果每次19分钟访问缓存,缓存将永远不会过期。
    jon.valett@gmail.com
    • 已标记为答案 Hugo12345 2009年8月6日 17:24
    • 取消答案标记 Hugo12345 2009年8月6日 17:24
    • 已标记为答案 KeFang Chen 2009年8月10日 3:03
    2009年8月6日 17:18
    版主
  • 那我设为TimeSpan.Zero是不是就是只要过10s就过期呢?
    郭鹏
    2009年8月6日 17:25
  • 好像使用TimeSpan.Zero还是不行。要怎么做才能做到只要过10s就过期呢?
    郭鹏
    2009年8月6日 17:41
  • 你再设置减少3秒的值试试 asp.net不像Windows开发那么准吧 避免不了请求费时间问题 
    2009年8月6日 23:21
  • 你好设置NoSlidingExpiration以禁用可调过期,即是说将插入缓存的方法的参数中的slidingExpiration 参数设置成 TimeSpan.Zero 字段

    关于slidingExpiration:最后一次访问所插入对象时与该对象过期时之间的时间间隔。如果该值等效于 20 分钟,则对象在最后一次被访问 20 分钟之后将过期并被从缓存中移除

    你这里的情况设置NoSlidingExpiration后,其实相当于10s后就过期无论客户端是否在这段时间内访问

    但是实际上是13s这可能是由于一些计时器的误差导致的,因为Timer并不是那样精确的

    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    2009年8月7日 1:58
    版主
  • 你好,Cashe的时间精度确实不是很高。
    jon.valett@gmail.com
    2009年8月7日 2:24
    版主
  • 那这么说我最开始的写法就是指定绝对10s秒后过期。但是由于Timer不准确所以导致延迟了10+s 后才执行了删除?


    郭鹏
    2009年8月7日 3:23
  • 你好,理论上是这样的
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    2009年8月7日 3:25
    版主
  • 那这么说我最开始的写法就是指定绝对10s秒后过期。但是由于Timer不准确所以导致延迟了10+s 后才执行了删除?


    郭鹏
    是的!

    jon.valett@gmail.com
    2009年8月7日 3:25
    版主
  • 使用UTC时间格式会基本控制在误差1秒内

    DateTime.Now.ToUniversalTime().AddSeconds(10),


    【孟子E章】
    2009年8月7日 5:23
    版主
  • DateTime.UtcNow.AddMilliseconds(10000)
    【孟子E章】
    2009年8月7日 5:28
    版主
  • 您好,windows不是实时操作系统,每个线程的cpu时间是由windows来调度和分配的。
    达不到精确的要求。
    2009年8月7日 8:10
    版主