Здравствуйте. Мне нужно рассчитать среднее значение полученных данных в секунду.
Например, есть класс:
class StateMonitor
{
private long _quantityOfValues;
private long _quantityOfCalls;
private readonly object _quantityOfValuesSync = new object();
private readonly object _frequencySync = new object();
public void Increment()
{
lock (_quantityOfValuesSync)
{
++_quantityOfValues;
}
}
public int Frequency
{
get
{
long quantityOfValues;
lock (_quantityOfValuesSync)
{
quantityOfValues = _quantityOfValues;
}
lock (_frequencySync)
{
double result = (double)quantityOfValues / ++_quantityOfCalls;
result = Math.Round(result, MidpointRounding.AwayFromZero);
return (int)result;
}
}
}
}
Чтобы он правильно считал частоту вызова метода Increment в секунду нужно вызывать свойство Frequency 1 раз в секунду. Что нельзя назвать удобным и надёжным. Наверняка есть формула для такого подсчёта. Догадываюсь, что нужно будет сохранять время последнего вызова свойства Frequency, чтобы правильно считать. Чёт никак не допетрю, как же правильно считать?
Вот код для теста класса выше:
using System;
using System.Threading;
using System.Threading.Tasks;
namespace FrequencyReceivingTest2
{
internal class Program
{
#region Entry point
private static Program _program;
private static void Main(string[] args)
{
_program = new Program();
_program.Run(args);
}
#endregion
private void Run(string[] args)
{
var monitor = new StateMonitor();
int counter = 0;
Task[] tasks =
{
new Task(() =>
{
while (counter++ < 20)
{
int ms = 0;
while (ms < 1000)
{
const int WaitMs = 200;
monitor.Increment();
Thread.Sleep(WaitMs);
ms += WaitMs;
}
}
}),
new Task(() =>
{
while (counter < 20)
{
Console.WriteLine("Частота обновления: {0}/сек. ", monitor.Frequency);
Thread.Sleep(1000);
}
}),
};
Array.ForEach(tasks, task => task.Start());
Task.WaitAll(tasks);
Console.WriteLine("Конец.");
Console.ReadKey();
}
}
}