annotate Source/Aspects/CacheAspect.cs @ 9:1e85f66cf767 default tip

update bltoolkit
author nickolay
date Thu, 05 Apr 2018 20:53:26 +0300
parents f990fcb411a9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1 using System;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2 using System.Collections;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3 using System.Collections.Generic;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4 using System.Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5 using System.Threading;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7 namespace BLToolkit.Aspects
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9 using Common;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 public delegate bool IsCacheableParameterType(Type parameterType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 /// http://www.bltoolkit.net/Doc/Aspects/index.htm
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 [System.Diagnostics.DebuggerStepThrough]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 public class CacheAspect : Interceptor
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 #region Init
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 static CacheAspect()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 MaxCacheTime = int.MaxValue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 IsEnabled = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 CleanupThread.Init();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 public CacheAspect()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 _registeredAspects.Add(this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 private MethodInfo _methodInfo;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35 private int? _instanceMaxCacheTime;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 private bool? _instanceIsWeak;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 public override void Init(CallMethodInfo info, string configString)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 base.Init(info, configString);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 info.CacheAspect = this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 _methodInfo = info.MethodInfo;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 var ps = configString.Split(';');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 foreach (var p in ps)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 var vs = p.Split('=');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 if (vs.Length == 2)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 switch (vs[0].ToLower().Trim())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56 case "maxcachetime": _instanceMaxCacheTime = int. Parse(vs[1].Trim()); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 case "isweak": _instanceIsWeak = bool.Parse(vs[1].Trim()); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 private static readonly IList _registeredAspects = ArrayList.Synchronized(new ArrayList());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64 protected static IList RegisteredAspects
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66 get { return _registeredAspects; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 public static CacheAspect GetAspect(MethodInfo methodInfo)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71 lock (RegisteredAspects.SyncRoot)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 foreach (CacheAspect aspect in RegisteredAspects)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 if (aspect._methodInfo == methodInfo)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74 return aspect;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 #region Overrides
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 protected override void BeforeCall(InterceptCallInfo info)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 if (!IsEnabled)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 return;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88 var cache = Cache;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 lock (cache.SyncRoot)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92 var key = GetKey(info);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 var item = GetItem(cache, key);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 if (item != null && !item.IsExpired)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 info.InterceptResult = InterceptResult.Return;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 info.ReturnValue = item.ReturnValue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100 if (item.RefValues != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 var pis = info.CallMethodInfo.Parameters;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 var n = 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 for (var i = 0; i < pis.Length; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106 if (pis[i].ParameterType.IsByRef)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107 info.ParameterValues[i] = item.RefValues[n++];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110 info.Cached = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 info.Items["CacheKey"] = key;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119 protected override void AfterCall(InterceptCallInfo info)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121 if (!IsEnabled)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122 return;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124 var cache = Cache;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 lock (cache.SyncRoot)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128 var key = (CompoundValue)info.Items["CacheKey"];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 if (key == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131 return;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133 var maxCacheTime = _instanceMaxCacheTime ?? MaxCacheTime;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134 var isWeak = _instanceIsWeak ?? IsWeak;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136 var item = new CacheAspectItem
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138 ReturnValue = info.ReturnValue,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139 MaxCacheTime = maxCacheTime == int.MaxValue || maxCacheTime < 0 ?
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140 DateTime.MaxValue :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141 DateTime.Now.AddMilliseconds(maxCacheTime),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142 };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144 var pis = info.CallMethodInfo.Parameters;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145 var n = 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147 foreach (var pi in pis)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148 if (pi.ParameterType.IsByRef)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149 n++;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151 if (n > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153 item.RefValues = new object[n];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155 n = 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157 for (var i = 0; i < pis.Length; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158 if (pis[i].ParameterType.IsByRef)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159 item.RefValues[n++] = info.ParameterValues[i];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162 cache[key] = isWeak? (object)new WeakReference(item): item;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168 #region Global Parameters
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
170 public static bool IsEnabled { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
171 public static int MaxCacheTime { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
172 public static bool IsWeak { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
173
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
174 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
175
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
176 #region IsCacheableParameterType
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
177
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
178 private static IsCacheableParameterType _isCacheableParameterType =
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
179 IsCacheableParameterTypeInternal;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
180
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
181 public static IsCacheableParameterType IsCacheableParameterType
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
182 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
183 get { return _isCacheableParameterType; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
184 set { _isCacheableParameterType = value ?? IsCacheableParameterTypeInternal; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
185 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
186
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
187 private static bool IsCacheableParameterTypeInternal(Type parameterType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
188 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
189 return parameterType.IsValueType || parameterType == typeof(string);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
190 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
191
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
192 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
193
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
194 #region Cache
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
195
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
196 private IDictionary _cache;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
197 public IDictionary Cache
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
198 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
199 get { return _cache ?? (_cache = CreateCache()); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
200 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
201
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
202 protected virtual CacheAspectItem CreateCacheItem(InterceptCallInfo info)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
203 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
204 return new CacheAspectItem();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
205 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
206
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
207 protected virtual IDictionary CreateCache()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
208 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
209 return Hashtable.Synchronized(new Hashtable());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
210 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
211
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
212 protected static CompoundValue GetKey(InterceptCallInfo info)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
213 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
214 var parInfo = info.CallMethodInfo.Parameters;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
215 var parValues = info.ParameterValues;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
216 var keyValues = new object[parValues.Length];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
217 var cacheParams = info.CallMethodInfo.CacheableParameters;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
218
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
219 if (cacheParams == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
220 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
221 info.CallMethodInfo.CacheableParameters = cacheParams = new bool[parInfo.Length];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
222
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
223 for (var i = 0; i < parInfo.Length; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
224 cacheParams[i] = IsCacheableParameterType(parInfo[i].ParameterType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
225 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
226
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
227 for (var i = 0; i < parValues.Length; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
228 keyValues[i] = cacheParams[i] ? parValues[i] : null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
229
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
230 return new CompoundValue(keyValues);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
231 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
232
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
233 protected static CacheAspectItem GetItem(IDictionary cache, CompoundValue key)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
234 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
235 var obj = cache[key];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
236
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
237 if (obj == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
238 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
239
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
240 var wr = obj as WeakReference;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
241
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
242 if (wr == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
243 return (CacheAspectItem)obj;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
244
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
245 obj = wr.Target;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
246
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
247 if (obj != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
248 return (CacheAspectItem)obj;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
249
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
250 cache.Remove(key);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
251
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
252 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
253 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
254
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
255 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
256 /// Clear a method call cache.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
257 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
258 /// <param name="methodInfo">The <see cref="MethodInfo"/> representing cached method.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
259 public static void ClearCache(MethodInfo methodInfo)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
260 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
261 if (methodInfo == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
262 throw new ArgumentNullException("methodInfo");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
263
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
264 var aspect = GetAspect(methodInfo);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
265
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
266 if (aspect != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
267 CleanupThread.ClearCache(aspect.Cache);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
268 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
269
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
270 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
271 /// Clear a method call cache.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
272 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
273 /// <param name="declaringType">The method declaring type.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
274 /// <param name="methodName">The method name.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
275 /// <param name="types">An array of <see cref="System.Type"/> objects representing
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
276 /// the number, order, and type of the parameters for the method to get.-or-
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
277 /// An empty array of the type <see cref="System.Type"/> (for example, <see cref="System.Type.EmptyTypes"/>)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
278 /// to get a method that takes no parameters.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
279 public static void ClearCache(Type declaringType, string methodName, params Type[] types)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
280 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
281 ClearCache(GetMethodInfo(declaringType, methodName, types));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
282 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
283
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
284 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
285 /// Clear a method call cache.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
286 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
287 /// <param name="declaringType">The method declaring type.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
288 /// <param name="methodName">The method name.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
289 /// <param name="types">An array of <see cref="System.Type"/> objects representing
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
290 /// the number, order, and type of the parameters for the method to get.-or-
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
291 /// An empty array of the type <see cref="System.Type"/> (for example, <see cref="System.Type.EmptyTypes"/>)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
292 /// to get a method that takes no parameters.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
293 /// <param name="values">An array of values of the parameters for the method to get</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
294 public static void ClearCache(Type declaringType, string methodName, Type[] types, object[] values)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
295 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
296 var methodInfo = GetMethodInfo(declaringType, methodName, types);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
297
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
298 if (methodInfo == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
299 throw new ArgumentNullException("methodInfo");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
300
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
301 var aspect = GetAspect(methodInfo);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
302
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
303 if (aspect != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
304 CleanupThread.ClearCache(aspect.Cache, new CompoundValue(values));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
305 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
306
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
307 public static void ClearCache(Type declaringType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
308 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
309 if (declaringType == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
310 throw new ArgumentNullException("declaringType");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
311
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
312 if (declaringType.IsAbstract)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
313 declaringType = TypeBuilder.TypeFactory.GetType(declaringType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
314
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
315 lock (RegisteredAspects.SyncRoot)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
316 foreach (CacheAspect aspect in RegisteredAspects)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
317 if (aspect._methodInfo.DeclaringType == declaringType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
318 CleanupThread.ClearCache(aspect.Cache);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
319 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
320
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
321 public static MethodInfo GetMethodInfo(Type declaringType, string methodName, params Type[] parameterTypes)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
322 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
323 if (declaringType == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
324 throw new ArgumentNullException("declaringType");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
325
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
326 if (declaringType.IsAbstract)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
327 declaringType = TypeBuilder.TypeFactory.GetType(declaringType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
328
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
329 if (parameterTypes == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
330 parameterTypes = Type.EmptyTypes;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
331
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
332 var methodInfo = declaringType.GetMethod(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
333 methodName,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
334 BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
335 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
336 parameterTypes,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
337 null);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
338
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
339 if (methodInfo == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
340 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
341 methodInfo = declaringType.GetMethod(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
342 methodName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
343
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
344 if (methodInfo == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
345 throw new ArgumentException(string.Format("Method '{0}.{1}' not found.",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
346 declaringType.FullName, methodName));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
347 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
348
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
349 return methodInfo;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
350 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
351
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
352 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
353 /// Clear all cached method calls.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
354 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
355 public static void ClearCache()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
356 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
357 CleanupThread.ClearCache();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
358 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
359
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
360 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
361
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
362 #region Cleanup Thread
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
363
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
364 public class CleanupThread
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
365 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
366 private CleanupThread() {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
367
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
368 internal static void Init()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
369 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
370 AppDomain.CurrentDomain.DomainUnload += CurrentDomain_DomainUnload;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
371 Start();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
372 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
373
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
374 static void CurrentDomain_DomainUnload(object sender, EventArgs e)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
375 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
376 Stop();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
377 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
378
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
379 static volatile Timer _timer;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
380 static readonly object _syncTimer = new object();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
381
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
382 private static void Start()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
383 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
384 if (_timer == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
385 lock (_syncTimer)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
386 if (_timer == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
387 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
388 var interval = TimeSpan.FromSeconds(10);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
389 _timer = new Timer(Cleanup, null, interval, interval);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
390 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
391 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
392
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
393 private static void Stop()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
394 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
395 if (_timer != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
396 lock (_syncTimer)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
397 if (_timer != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
398 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
399 _timer.Dispose();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
400 _timer = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
401 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
402 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
403
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
404 private static void Cleanup(object state)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
405 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
406 if (!Monitor.TryEnter(RegisteredAspects.SyncRoot, 10))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
407 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
408 // The Cache is busy, skip this turn.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
409 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
410 return;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
411 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
412
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
413 var start = DateTime.Now;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
414 var objectsInCache = 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
415
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
416 try
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
417 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
418 _workTimes++;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
419
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
420 var list = new List<DictionaryEntry>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
421
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
422 foreach (CacheAspect aspect in RegisteredAspects)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
423 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
424 var cache = aspect.Cache;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
425
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
426 lock (cache.SyncRoot)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
427 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
428 foreach (DictionaryEntry de in cache)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
429 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
430 var wr = de.Value as WeakReference;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
431
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
432 bool isExpired;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
433
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
434 if (wr != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
435 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
436 var ca = wr.Target as CacheAspectItem;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
437
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
438 isExpired = ca == null || ca.IsExpired;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
439 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
440 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
441 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
442 isExpired = ((CacheAspectItem)de.Value).IsExpired;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
443 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
444
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
445 if (isExpired)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
446 list.Add(de);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
447 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
448
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
449 foreach (var de in list)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
450 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
451 cache.Remove(de.Key);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
452 _objectsExpired++;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
453 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
454
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
455 list.Clear();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
456
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
457 objectsInCache += cache.Count;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
458 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
459 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
460
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
461 _objectsInCache = objectsInCache;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
462 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
463 finally
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
464 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
465 _workTime += DateTime.Now - start;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
466
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
467 Monitor.Exit(RegisteredAspects.SyncRoot);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
468 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
469 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
470
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
471 private static int _workTimes;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
472 public static int WorkTimes
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
473 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
474 get { return _workTimes; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
475 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
476
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
477 private static TimeSpan _workTime;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
478 public static TimeSpan WorkTime
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
479 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
480 get { return _workTime; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
481 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
482
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
483 private static int _objectsExpired;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
484 public static int ObjectsExpired
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
485 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
486 get { return _objectsExpired; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
487 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
488
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
489 private static int _objectsInCache;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
490 public static int ObjectsInCache
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
491 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
492 get { return _objectsInCache; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
493 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
494
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
495 public static void UnregisterCache(IDictionary cache)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
496 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
497 lock (RegisteredAspects.SyncRoot)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
498 RegisteredAspects.Remove(cache);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
499 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
500
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
501 public static void ClearCache(IDictionary cache)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
502 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
503 lock (RegisteredAspects.SyncRoot) lock (cache.SyncRoot)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
504 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
505 _objectsExpired += cache.Count;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
506 cache.Clear();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
507 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
508 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
509
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
510 public static void ClearCache(IDictionary cache, CompoundValue key)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
511 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
512 lock (RegisteredAspects.SyncRoot)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
513 lock (cache.SyncRoot)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
514 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
515 _objectsExpired += 1;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
516 cache.Remove(key);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
517 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
518 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
519
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
520 public static void ClearCache()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
521 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
522 lock (RegisteredAspects.SyncRoot)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
523 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
524 foreach (CacheAspect aspect in RegisteredAspects)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
525 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
526 _objectsExpired += aspect.Cache.Count;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
527 aspect.Cache.Clear();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
528 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
529 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
530 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
531 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
532
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
533 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
534 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
535 }