namespace YourNamespace
{
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
// .NET < 4.5: System.Runtime.CompilerServices entfernen
using System.Runtime.CompilerServices;
using System.Timers;
internal sealed class MeasureEventArgs : EventArgs
{
public double Result { get; private set; }
public MeasureEventArgs( double result )
{
Result = result;
}
}
internal sealed class AverageTimeCalculator : INotifyPropertyChanged, IDisposable
{
#region Fields
private readonly Timer _timer;
private uint _iterations;
private readonly List<double> _extensions;
private double _average;
private Func<double> _doMeasure;
#endregion
#region Constructor
public AverageTimeCalculator()
{
_extensions = new List<double>();
_timer = new Timer();
_timer.Elapsed += OnTimerTick;
}
#endregion
#region Events
public delegate void MeasureEventhandler( object sender, MeasureEventArgs e );
public event MeasureEventhandler Measured;
public event PropertyChangedEventHandler PropertyChanged;
#endregion
#region Properties
public double Average
{
get
{
return _average;
}
private set
{
if ( !_average.Equals( value ) )
{
_average = value;
// .NET >= 4.5
RaisePropertyChanged();
// .NET < 4.5
//RaisePropertyChanged( "Average" );
}
}
}
public bool IsActive { get { return _timer.Enabled; } }
#endregion
#region Public Methods
public void Dispose()
{
if ( _timer.Enabled )
{
_timer.Stop();
}
_timer.Dispose();
}
public void Run( double interval, uint iterations, Func<double> measure )
{
if ( _timer.Enabled )
{
_extensions.Clear();
Average = 0;
_timer.Stop();
}
_doMeasure = measure;
_timer.Interval = interval;
_iterations = iterations;
_timer.Start();
RaisePropertyChanged( "IsActive" );
}
#endregion
#region Methods
private void OnTimerTick( object sender, ElapsedEventArgs e )
{
_extensions.Add( _doMeasure.Invoke() );
Average = _extensions.Average();
_iterations--;
if ( _iterations < 1 )
{
_timer.Stop();
RaiseMeasured( new MeasureEventArgs( Average ) );
RaisePropertyChanged( "IsActive" );
}
}
private void RaiseMeasured( MeasureEventArgs e )
{
MeasureEventhandler handler = Measured;
if ( handler != null )
{
handler( this, e );
}
}
// .NET < 4.5
// public void RaisePropertyChanged( string propertyName )
// .NET >= 4.5
private void RaisePropertyChanged( [CallerMemberName] string propertyName = null )
{
PropertyChangedEventHandler handler = PropertyChanged;
if ( handler != null )
{
PropertyChangedEventArgs e = new PropertyChangedEventArgs( propertyName );
handler( this, e );
}
}
#endregion
}
}