/// <summary> /// Copyright © henryfan 2012 /// Email: henryfan@msn.com /// HomePage: http://www.ikende.com /// CreateTime: 2012/10/27 21:56:05 /// </summary> public class SecondCounter:IDisposable { interface ICounter { void Process(); } public event Action<CounterItem> Tick; private List<CounterItem> mItems = new List<CounterItem>(); public class CounterItem : ICounter { private long mCount=0; private long mLastCount; public int Value { get; private set; } public string Name { get; set; } public void Add() { System.Threading.Interlocked.Increment(ref mCount); } public long Count { get { return mCount; } } public void Add(long value) { System.Threading.Interlocked.Add(ref mCount, value); } void ICounter.Process() { Value = (int)(mCount - mLastCount); mLastCount = mCount; } public override string ToString() { return string.Format("{0}:\t{1}/s", Name, Value); } } public CounterItem Add(string name) { CounterItem item = new CounterItem(); item.Name = name; mItems.Add(item); return item; } public void Open() { mTimer = new System.Threading.Timer(OnCallBack, this, 10, 980); } private void OnCallBack(object state) { for (int i = 0; i < mItems.Count; i++) { ((ICounter)mItems[i]).Process(); } try { if (Tick != null) { for (int i = 0; i < mItems.Count; i++) { Tick(mItems[i]); } } } catch { } } private System.Threading.Timer mTimer; private bool mIsDisposed = false; public void Dispose() { lock (this) { if (!mIsDisposed) { if (mTimer != null) mTimer.Dispose(); } } } }