Business Logic Toolkit for .NET
www.bltoolkit.net
|  Home   |  Download   |  Documentation   |  Discussions   |  License   |

  Source.Aspects.MethodCallCounter.cs

 
using System;
using System.Collections;
using System.Reflection;

namespace BLToolkit.Aspects
{
    [System.Diagnostics.DebuggerStepThrough]
    public class MethodCallCounter
    {
        public MethodCallCounter(CallMethodInfo methodInfo)
        {
            _callMethodInfo = methodInfo;
            _methodInfo     = methodInfo.MethodInfo;
        }

        #region Public Members

        private MethodInfo _methodInfo;
        public  MethodInfo  MethodInfo
        {
            get { return _methodInfo;  }
            set { _methodInfo = value; }
        }

        private CallMethodInfo _callMethodInfo;
        public  CallMethodInfo  CallMethodInfo
        {
            get { return _callMethodInfo;  }
            set { _callMethodInfo = value; }
        }

        private int _totalCount;
        public  int  TotalCount
        {
            get { return _totalCount;  }
            set { _totalCount = value; }
        }

        private int _exceptionCount;
        public  int  ExceptionCount
        {
            get { return _exceptionCount;  }
            set { _exceptionCount = value; }
        }

        private int _cachedCount;
        public  int  CachedCount
        {
            get { return _cachedCount;  }
            set { _cachedCount = value; }
        }

        private TimeSpan _totalTime;
        public  TimeSpan  TotalTime
        {
            get { return _totalTime;  }
            set { _totalTime = value; }
        }

        private TimeSpan _minTime = TimeSpan.MaxValue;
        public  TimeSpan  MinTime
        {
            get { return _minTime;  }
            set { _minTime = value; }
        }

        private TimeSpan _maxTime;
        public  TimeSpan  MaxTime
        {
            get { return _maxTime;  }
            set { _maxTime = value; }
        }

        private readonly ArrayList _currentCalls = ArrayList.Synchronized(new ArrayList());
        public           ArrayList  CurrentCalls
        {
            get { return _currentCalls; }
        }

        public TimeSpan AverageTime
        {
            get
            {
                if (_totalCount == 0)
                    return TimeSpan.MinValue;

                return new TimeSpan(TotalTime.Ticks / TotalCount);
            }
        }

        #endregion

        #region Protected Members

        public virtual void RegisterCall(InterceptCallInfo info)
        {
            lock (_currentCalls.SyncRoot)
                _currentCalls.Add(info);
        }

        public virtual void UnregisterCall(InterceptCallInfo info)
        {
            AddCall(DateTime.Now - info.BeginCallTime, info.Exception != null, info.Cached);

            lock (_currentCalls.SyncRoot)
                _currentCalls.Remove(info);
        }

        protected void AddCall(TimeSpan time, bool withException, bool cached)
        {
            if (cached)
            {
                _cachedCount++;
            }
            else
            {
                _totalTime += time;
                _totalCount++;

                if (_minTime > time) _minTime = time;
                if (_maxTime < time) _maxTime = time;
            }

            if (withException) _exceptionCount++;
        }

        #endregion
    }
}
 
© 2010 www.bltoolkit.net
support@bltoolkit.net