Mercurial > pub > bltoolkit
view Source/Aspects/MethodCallCounter.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
line wrap: on
line source
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 } }