我有一个客户可以下订单的系统。下订单后,他们有60分钟的时间来支付它,然后才会被删除。在订购时在服务器端我创建计时器并将经过时间设置为60分钟
System.Timer.Timers timer = new System.Timers.Timer(1000*60*60);
timer.AutoReset = false;
timer.Elapsed += HandleElapsed;
timer.Start();
因为如果客户决定支付我希望能够处理计时器,并且我希望能够取消订单,如果他不这样做我会保留两个字典:
Dictionary<int, Timer> _orderTimer;
Dictionary<Timer, int> _timerOrder;
然后,当客户付款时,我可以通过orderId和O(1)访问Timer,这要归功于_orderTimer字典,当时间过去后,由于_timerOrder字典,我可以使用O(1)访问订单。
我的问题是:这是好的方法吗?假设我必须在一个时刻保留在字典中的最大行数是50000?
也许最好从Timer类派生,添加名为OrderId的属性,将其全部保存在List中并使用linq搜索顺序/计时器?
或许你我应该以不同的方式做到这一点?
答案 0 :(得分:2)
50000定时器可能比字典更容易出问题。
我会将它们添加到列表&lt;&gt;或队列&lt;&gt;并使用1个定时器,设置为最大容差(~30秒?),每次定时器结束,批量删除所有过期的订单。
答案 1 :(得分:0)
正如添加到Henks的回答一样,我会根据过期日期排序SortedList<Order>
。因此,您的单个计时器线程只需枚举列表,直到日期/时间超出范围。
答案 2 :(得分:0)
我不知道这是否可行,但另一种方法是存储它在数据存储中过期的时间,然后只编写一个计时器,然后获取所有相应的记录并决定如何处理它们。
有超过50,000名计时器坐在记忆中似乎有点......可怕。