Как сохранить таймеры при подключении к OrderId? - PullRequest
0 голосов
/ 02 июня 2010

У меня есть система, где клиенты могут делать заказы. После оформления заказа у них есть 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;

Затем, когда у клиента оплата, я могу получить доступ к Timer по orderId с помощью O (1) благодаря словарю _orderTimer, а по истечении времени я могу получить доступ к заказу с помощью O (1) благодаря словарю _timerOrder.

Мой вопрос: это хороший подход? Предполагая, что максимальное количество строк, которые я должен сохранить в словаре в один момент, будет 50000?

Может быть, было бы лучше извлечь из класса Timer, добавить свойство OrderId, сохранить все это в List и найти порядок / таймер с помощью linq?

Или, может быть, я должен сделать это по-другому?

Ответы [ 3 ]

2 голосов
/ 02 июня 2010

50000 Таймеры могут быть большей проблемой, чем словарь.

Я бы добавил их в список List <> или Queue <> и использовал бы 1 таймер, установив максимальный допуск (~ 30 секунд?), И каждый раз, когда истекает таймер, пакетное удаление всех просроченных заказов .

0 голосов
/ 02 июня 2010

Я не знаю, является ли это жизнеспособным, но другой подход состоял бы в том, чтобы сохранить время, истекающее в вашем хранилище данных, а затем просто написать один таймер, который затем соберет все соответствующие записи и решит, что с ними делать.

Наличие более 50 000 таймеров, сидящих в памяти, кажется немного ... страшным.

0 голосов
/ 02 июня 2010

Так же, как добавление к ответу Хенкса, я бы сделал SortedList<Order>, который отсортирован по дате истечения срока. Таким образом, ваш поток с одним таймером просто должен перечислять список, пока дата / время не выходят за рамки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...