我需要在预定义的时间以有效的方式运行数十万个函数,
我目前拥有的代码是这样的:
class myclass
{
public DateTime NextTime = DateTime.Now;
Random rand = new Random();
public void DoStuff()
{
if (NeedToWork())
{
// do some complex stuff on a 2nd thread.
NextTime = DateTime.Now.AddSeconds(rand.Next(60, 3600));
}
}
public bool NeedToWork()
{
return DateTime.Now > NextTime;
}
}
从计时器运行的调用函数:
static List<myclass> mylist = new List<myclass>();
static void Activator()
{
foreach (var item in mylist)
{
item.DoStuff();
}
}
我的问题是,当集合中有很多项目时,遍历所有项目需要很长时间,导致某些 DoStuff() 函数在某些情况下运行延迟超过一分钟。
目前从不同的线程同时调用“Activator”函数以使延迟时间尽可能低,(通过使用a来处理必要的线程同步Mutex
)
我想到的2个解决方案:
- 而不是有一个
List<myclass>
,我可以有一个像Dictionary<DateTime, List<myclass>>
1 秒精度的字典,并且每秒运行适当的类对象,字典会将“nexttime”映射到“myclass”实例。 - 创建两个
List<>
s 或Queue<>
s 而不是一个列表,它们将被命名为 'fastqueue' 和 'slowqueue' ,slowqueue 将拥有所有对象,fastqueue 将拥有所有即将需要工作的项目,然后有一个专用线程循环通过慢队列,并检查剩余时间并将其放入快速队列。
笔记:
真正的代码没有任何随机数据决定下一次运行时间,它实际上是基于一些计算,这只是一个示例。
每个项目运行时间不超过几分之一秒,每个项目在一小时内最多运行 4 次。ram 和 cpu 功率不是问题,我已经测试并在不同区域进行了优化以使其适合,尽管此处并未显示所有代码。
- 唯一浪费 cpu 时间的是返回 DateTime.Now > NextTime 的行