2009-06-26 4 views

답변

0

설정된 간격으로 우선 순위가 지정된 메시지를 전달하는 Subscription 클래스를 작성했습니다. 우선 순위가 매겨진 메시지를 소비하는 가장 이상적인 일반적인 방법은 아니지만 후일을 위해 게시합니다. 나는 커스텀 RequestReplyChannel이 특정 다른 경우에 더 좋은 옵션이 될 것이라고 생각한다. PriorityQueue 구현은 독자에게 연습 과제로 남겨 둡니다. 대신 (OrderedBag )는 .NET에 대한 인 Wintellect의 전원 컬렉션을 사용하여 고려할 수 자체를 작성

class PrioritySubscriber<T> : BaseSubscription<T> 
{ 
    private readonly PriorityQueue<T> queue; 
    private readonly IScheduler scheduler; 
    private readonly Action<T> receive; 
    private readonly int interval; 

    private readonly object sync = new object(); 
    private ITimerControl next = null; 

    public PrioritySubscriber(IComparer<T> comparer, IScheduler scheduler, 
     Action<T> receive, int interval) 
    { 
     this.queue = new PriorityQueue<T>(comparer); 
     this.scheduler = scheduler; 
     this.receive = receive; 
     this.interval = interval; 
    } 

    protected override void OnMessageOnProducerThread(T msg) 
    { 
     lock (this.sync) 
     { 
      this.queue.Enqueue(msg); 

      if (this.next == null) 
      { 
       this.next = 
        this.scheduler.Schedule(this.Receive, this.interval); 
      } 
     } 
    } 

    private void Receive() 
    { 
     T msg; 

     lock (this.sync) 
     { 
      msg = this.queue.Dequeue(); 

      if (this.queue.Count > 0) 
      { 
       this.next = 
        this.scheduler.Schedule(this.Receive, this.interval); 
      } 
     } 

     this.receive(msg); 
    } 
} 
+0

, 당신은 코드 플렉스를 통해 다음을 찾을 수 있습니다. – Rick