2010-06-02 6 views
0

고객이 주문할 수있는 시스템이 있습니다. 주문을 한 후 60 분 이내에 지불해야 삭제됩니다. 순서가 나는 경우 주문을 취소 할 수 있도록하려면 내가 타이머를 작성했고 나는 클라이언트가 지불하기로 결정하면 타이머를 처리 할 수 ​​있도록하려는 때문에 60분OrderId에 연결하여 타이머를 저장하는 방법은 무엇입니까?

System.Timer.Timers timer = new System.Timers.Timer(1000*60*60); 
timer.AutoReset = false; 
timer.Elapsed += HandleElapsed; 
timer.Start(); 

에 경과 시간을 설정하고 서버 측에서 그는 _timerOrder (1) 감사 _orderTimer 사전에

다음
Dictionary<int, Timer> _orderTimer; 
Dictionary<Timer, int> _timerOrder; 

클라이언트 급여의 나는 O와 ORDERID에 의해 타이머에 액세스 할 수 있습니다 (1) 감사와 시간이 경과 할 때 나는 O와 순서에 액세스 할 수 있습니다 : 저는 두 사전을 유지하지 않습니다 사전.

제 질문은 : 좋은 것입니까? 내가 한순간에 사전에 보관해야하는 최대 행 수가 50000이 될 것이라고 가정합니다.

아마도 Timer 클래스에서 OrderId라는 속성을 추가하고 List에서 모두 유지하고 linq를 사용하여 주문/타이머를 검색하는 것이 더 낫겠습니까?

아니면 다른 방식으로해야합니까?

답변

2

50000 타이머가 사전보다 문제가 될 수 있습니다.

나는 그들은 목록 <> 또는 큐 <에 추가>와 최대 허용 오차 (~ 30 분?)와 타이머가 경과 배치가 만기 된 모든 명령을 제거 할 때마다로 설정 한 타이머를 사용합니다.

+0

귀하의 의견을 듣습니다. 나는 또한 많은 타이머가 문제가 될 수 있다고 생각했다. 대답 해줘서 고마워요. –

0

마찬가지로 Henks에 대한 대답은 만료 날짜순으로 정렬되는 SortedList<Order>입니다. 따라서 단일 타이머 스레드는 날짜/시간이 범위를 벗어날 때까지 목록을 통해 열거해야합니다.

+2

모든 고객에게 60 분이 있으면 대기열이 더 잘 작동합니다. 특정 고객이 지불 기간이 더 길거나 짧으면 'SortedList'가 가장 좋습니다. – dlras2

+0

네, 맞습니다. 모든 사람들을위한 정적 시간 간격으로 대기열이 더 잘 맞습니다. – Oliver

0

이것이 가능한지는 모르겠지만 만료되는 시간을 데이터 저장소에 저장 한 다음 하나의 타이머를 작성한 다음 적절한 모든 레코드를 선택하고 해당 레코드로 수행 할 작업을 결정하십시오. .

메모리에 앉아있는 50,000 명 이상의 타이머가 조금은 무서운 것 같습니다.

관련 문제