Frage

Wie kann Kanaleingang in einer priorisierten Weise behandelt werden? Gibt es etwas gleichwertig zu Scala „reactWithin(0) { ... case TIMEOUT }“ konstruieren?

War es hilfreich?

Lösung

Ich schrieb eine Abonnement-Klasse, die priorisierte Nachrichten auf einem festgelegten Intervall liefert. Es ist kein idealer allgemeiner Fall Weg priorisierte Nachrichten zu konsumieren, aber ich werde es Post für die Nachwelt. Ich denke, eine benutzerdefinierte RequestReplyChannel eine bessere Option für bestimmte andere Fälle wäre. Implementierung von Priorityqueue bleibt als Übung für den Leser.

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);
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top