zhaolei
2020-11-20 921de2254ff5712a44ed8575ee8efe34252f6603
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
using System;
using System.Threading;
 
namespace Prow.Cache
{
    /// <summary>
    /// 自动过期缓存项
    /// </summary>
    public class AutoExpireCacheEntry<T> : IDisposable
    {
        private readonly Timer dispatcher;
 
        /// <summary>
        /// 获得 缓存值
        /// </summary>
        public T Value { get; }
 
        /// <summary>
        /// 获得 缓存对象存活时长 -1 表示永久缓存
        /// </summary>
        public int Period { get; }
 
        /// <summary>
        /// 获得/设置 缓存项描述信息
        /// </summary>
        public string? Desc { get; set; }
 
        /// <summary>
        /// 获得 最后更新时间
        /// </summary>
        public DateTimeOffset CreateTime { get; private set; }
 
#nullable disable
        /// <summary>
        /// 默认构造函数
        /// </summary>
        /// <param name="value">缓存对象</param>
        /// <param name="period">存活时长,单位毫秒</param>
        /// <param name="action">缓存过期回调函数</param>
        public AutoExpireCacheEntry(T value, int period, Action<T> action)
        {
            Period = value == null ? 50 : period;
            Value = value;
            CreateTime = DateTimeOffset.Now;
            if (period != -1)
            {
                // period = -1 表示永久缓存
                dispatcher = new Timer(o =>
                {
                    action(Value);
                }, null, period, Timeout.Infinite);
            }
        }
#nullable restore
 
        /// <summary>
        /// 重置缓存时间方法
        /// </summary>
        public void Reset()
        {
            if (!disposed)
            {
                CreateTime = DateTimeOffset.Now;
                dispatcher.Change(Period, Timeout.Infinite);
            }
        }
 
        #region Impletement IDispose
        private bool disposed;
        /// <summary>
        /// Dispose 方法
        /// </summary>
        /// <param name="disposing"></param>
        protected virtual void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (!disposed)
                {
                    disposed = true;
                    dispatcher.Dispose();
                }
            }
        }
 
        /// <summary>
        /// Dispose 方法
        /// </summary>
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
        #endregion
    }
}