Pregunta

¿Cómo se puede manejar la entrada del canal de manera priorizada? ¿Hay algo equivalente? a " reactWithin(0) { ... case TIMEOUT } " de Scala; ¿construir?

¿Fue útil?

Solución

Escribí una clase de Suscripción que entrega mensajes priorizados en un intervalo establecido. No es una forma de caso general ideal para consumir mensajes priorizados, pero lo publicaré para la posteridad. Creo que un RequestReplyChannel personalizado sería una mejor opción para ciertos otros casos. La implementación de PriorityQueue se deja como un ejercicio para el lector.

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);
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top