代码之家  ›  专栏  ›  技术社区  ›  Adrian Serafin

如何保存连接到OrderId的计时器?

  •  0
  • Adrian Serafin  · 技术社区  · 16 年前

    我有一个客户可以下订单的系统。下单后,他们有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;
    

    我的问题是:这是个好办法吗?假设一分钟内我必须在字典中保留的最大行数是50000行?

    也许最好从Timer类派生,添加名为OrderId的属性,将其全部保存在列表中,并使用linq搜索order/Timer?

    或者你觉得我应该换一种方式?

    3 回复  |  直到 16 年前
        1
  •  2
  •   Henk Holterman    16 年前

    5万个计时器可能比字典更麻烦。

    我会把它们加到 排队<&燃气轮机;使用1个定时器,设置为最大容差(~30秒?),每次定时器超时,批量删除所有过期订单。

        2
  •  0
  •   Oliver    16 年前

    作为对亨克斯回答的补充,我会 SortedList<Order> 按过期日期排序。因此,您的单个计时器线程只需在列表中枚举,直到某个日期/时间超出范围。

        3
  •  0
  •   CubanX    16 年前

    我不知道这是否可行,但另一种方法是将过期的时间存储在数据存储中,然后只编写一个计时器,然后提取所有适当的记录并决定如何处理它们。

    有5万个以上的计时器在记忆中只是有点…可怕。