c# – 在预定义的时间有效运行数十万个函数
我需要在预定义的时间以有效的方式运行数十万个函数,
我目前的代码是这样的: 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”函数以使延迟时间尽可能低(使用Mutex处理必要的线程同步) 我想到的2个解决方案: >而不是有一个List< myclass>,我可以有一个字典,如Dictionary< DateTime,List< myclass>>,精度为1秒,每秒运行相应的类对象,dictionay将映射’nexttime ‘到’myclass’实例. 笔记: >实际代码没有任何随机数据确定下一个运行时间,它实际上是基于一些计算,这只是一个样本. 解决方法
您可能希望维护已排序的队列或工作树,并按运行时间排序.
然后,您的常规间隔计时器循环运行队列中的前N个项目,当项目超出当前间隔时间时停止,因为无需进一步查看. 在生成要添加到队列的新工作时,使用已排序的数据结构,插入应正确放置以保持其排序. (在添加和删除队列时,您还需要担心线程安全.) (仅供参考,调度算法有很多变化.) 另外需要注意的是,虽然不确定它是否对你有用,但是当使用这些基于时间的公式时,你可能会考虑使用DateTime.Now快照多次使用,否则你可以“松散”这个线程的时间在调用DateTime.Now之间中断 public void DoStuff(DateTime now) { if (NeedToWork(now)) { // do some complex stuff on a 2nd thread. NextTime = now.AddSeconds(rand.Next(60,3600)); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |