Using System; Using System. Collections. Generic; Using System. LINQ; Using System. Web; Using System. Collections. Concurrent; Namespace Pdajob. pdaservice. Service { Public Class Cachelist <t> { Private Int Maxsize = 10000 ; Private Int Shrinklen = 2000 ; Private Concurrentqueue <cacheitem <t> _ queue = New Concurrentqueue <cacheitem <t> (); Public Cachelist ( Int Maxsize,Int Shrinklen ){ This . Maxsize = Maxsize; This . Shrinklen = Shrinklen ;} Public Void Add (T item ){ # Region Contract if the value is exceeded If (_ Queue. Count> = Maxsize ){ Lock (This ){ If (_ Queue. Count> = Maxsize) {cacheitem <T> Outitem; For ( Int I = 0 ; I <shrinklen; I ++ ) {_ Queue. trydequeue ( Out Outitem );}}}} # Endregion _ Queue. enqueue ( New Cacheitem <t> () {DATA = item, addtime = Datetime. Now });} Public Concurrentqueue <cacheitem <t> Queue { Get { Return _ Queue ;}}} /// <Summary> /// Cached content /// </Summary> /// <Typeparam name = "T"> </typeparam> Public Class Cacheitem <t> { Public Datetime addtime { Get ; Set ;} Public T data { Get ; Set ;}}}
View code
In a multi-threaded environment, multiple threads may read queue. Count> maxsize. Although queue is thread safeCodeIt can cause _ queue to be moved empty again, so you need to add lock