2009-06-26 7 views

Répondre

0

J'ai écrit une classe d'abonnement qui fournit des messages prioritaires sur un intervalle défini. Ce n'est pas un cas général idéal pour consommer des messages prioritaires, mais je l'afficherai pour la postérité. Je pense qu'un RequestReplyChannel personnalisé serait une meilleure option pour certains autres cas. La mise en œuvre de PriorityQueue est laissée au lecteur en tant qu'exercice.

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

Au lieu d'écrire votre propre, vous pouvez envisager d'utiliser les collections électriques de Wintellect pour .NET (OrderedBag ), vous pouvez trouver ces via CodePlex. – Rick

Questions connexes