2009-06-26 5 views

Antwort

0

Ich schrieb eine Abonnementklasse, die priorisierte Nachrichten in einem festgelegten Intervall liefert. Es ist kein idealer allgemeiner Fall, um priorisierte Nachrichten zu konsumieren, aber ich poste es für die Nachwelt. Ich denke, eine benutzerdefinierte RequestReplyChannel wäre eine bessere Option für bestimmte andere Fälle. Die Implementierung der PriorityQueue bleibt dem Leser als Übung überlassen.

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

Statt Ihre eigene schreiben Sie Wintellect Power Kollektionen von .NET (OrderedBag ) mit in Erwägung ziehen könnte, können Sie diese über CodePlex finden. – Rick