我想编写一个类,它会以x
每秒预定义的次数触发事件调用它n
。
但是,我不想在每秒内均匀地开火x
。
因此,假设n
= 100, 25 可能会在前 300 毫秒内触发,然后在接下来的 600 毫秒内再触发 50 次,在剩余的 100 毫秒内触发最后 25 次。
理想情况下,我想要比上面介绍的更好的粒度和每秒内更大的间距范围。
我想知道我是否能够创建一个定义毫秒的数组以及要触发多少个事件。然后使用循环和Stopwatch
类来确定是否应该触发该毫秒航点的定义事件。
问题是,是否可以足够快地每秒计算数组,每一秒都应该有随机间距。
显然,事件需要是异步的,以避免被连接到它的东西延迟。
有人遇到过类似的需求吗?
更新
我想我至少会把我最初的努力放在这里。
所以我发现有足够的分辨率来检查你当前处于哪一毫秒和哪一秒。基本上,每一秒我重建我的间距,每毫秒都会在数组中获得一个条目,每个条目表示该毫秒触发事件的次数。
我的问题是间距...我需要一种更好的方法来尝试聚集事件计数,目前这个 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;
}
}