イベントを発生させるクラスを作成したいと思います。x
これは、1 秒間に事前に定義された回数呼び出されn
ます。
ただし、毎秒均等に発砲したくx
ありません。
したがって、たとえばn
= 100 とすると、最初の 300 ミリ秒で 25 発、次の 600 ミリ秒でさらに 50 発、残りの 100 ミリ秒で最後の 25 発が発生する可能性があります。
理想的には、上記よりも優れた粒度と、1 秒あたりの間隔の範囲を広げたいと考えています。
定義されたミリ秒と発生するイベントの数で配列を作成できるかどうか疑問に思っています。次に、ループとStopwatch
クラスを使用して、そのミリ秒のウェイポイントに対して定義されたイベントを発生させる必要があるかどうかを判断します。
問題は、1 秒ごとに十分な速さで配列を計算できるかどうかです。1 秒ごとにランダムな間隔が必要です。
明らかに、イベントに接続されているものによって遅延が発生するのを避けるために、イベントは非同期である必要があります。
誰もが同様のニーズに出くわしますか?
アップデート
少なくともここで最初の努力をしようと思いました。
したがって、現在のミリ秒と秒を確認するのに十分な解像度があることがわかりました。基本的に、1 秒ごとに間隔を再構築し、ミリ秒ごとに配列内のエントリを取得し、各エントリはそのミリ秒でイベントを発生させる回数を示します。
私の問題は間隔です...イベントカウントを試してまとめるには、より良い方法が必要です.現在、このjsutは、0、1、または2のいずれかに均等に配置されているようです.
public delegate void EmptyEventDelegate();
public class RandEvent
{
public event EmptyEventDelegate OnEvent = delegate { };
private bool running = false;
Random r = new Random();
private int eventsPS;
public RandEvent(int eventsPS = 1)
{
this.eventsPS = eventsPS;
}
public void Start()
{
running = true;
Task.Factory.StartNew(() =>
{
Run();
});
}
private void Run()
{
var sw = new Stopwatch();
sw.Start();
int currentSecond = 0;
int[] eventCount = BuildEventSpacing();
while(running)
{
if (currentSecond != sw.Elapsed.Seconds)
{
currentSecond = sw.Elapsed.Seconds;
eventCount = BuildEventSpacing();
}
else
{
for(int i = 0; i < eventCount[sw.Elapsed.Milliseconds]; i++)
OnEvent();
}
}
sw.Stop();
}
private int[] BuildEventSpacing()
{
var array = new int[1000];
for (int i = 0; i < eventsPS; i++)
{
array[r.Next(0, 999)]++;
}
return array;
}
public void Stop()
{
running = false;
}
}