加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在预定义的时间有效运行数十万个函数

发布时间:2020-12-16 01:52:15 所属栏目:百科 来源:网络整理
导读:我需要在预定义的时间以有效的方式运行数十万个函数, 我目前的代码是这样的: class myclass{ public DateTime NextTime = DateTime.Now; Random rand = new Random(); public void DoStuff() { if (NeedToWork()) { // do some complex stuff on a 2nd thre
我需要在预定义的时间以有效的方式运行数十万个函数,

我目前的代码是这样的:

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’实例.
>创建两个List<> s或Queue<>而不是一个列表,它们将被命名为’fastqueue’,’slowqueue’,slowqueue将拥有所有对象,fastqueue将拥有即将到来的所有项目需要工作,然后有一个循环通过慢队列的专用线程,并检查剩余时间并将其置于fastqueue.

笔记:

>实际代码没有任何随机数据确定下一个运行时间,它实际上是基于一些计算,这只是一个样本.
>每个项目运行不需要超过一秒的时间,每个项目在一小时内最多只运行4次. ram和cpu功率不是问题,我已经测试并在不同区域进行了大量优化以使其适合,尽管并非所有代码都显示在此处.
>唯一浪费cpu时间的是返回DateTime.Now>的行.下次

解决方法

您可能希望维护已排序的队列或工作树,并按运行时间排序.

然后,您的常规间隔计时器循环运行队列中的前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));
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读