ManualResetEvent vs. Thread.Sleep

Implementé el siguiente subproceso de procesamiento en segundo plano, dondeJobs es unQueue<T>:

static void WorkThread()
{
    while (working)
    {
        var job;

        lock (Jobs)
        {
            if (Jobs.Count > 0)
                job = Jobs.Dequeue();
        }

        if (job == null)
        {
            Thread.Sleep(1);
        }
        else
        {
            // [snip]: Process job.
        }
    }
}

Esto produjo un retraso notable entre el momento en que se ingresaron los trabajos y el momento en que realmente comenzaron a ejecutarse (los lotes de trabajos se ingresan a la vez, y cada trabajo es solo [relativamente] pequeño). El retraso no fue un gran problema. Pero me puse a pensar en el problema e hice el siguiente cambio:

static ManualResetEvent _workerWait = new ManualResetEvent(false);
// ...
    if (job == null)
    {
        lock (_workerWait)
        {
            _workerWait.Reset();
        }
        _workerWait.WaitOne();
    }

Donde el hilo añadiendo trabajos ahora se bloquea._workerWait y llamadas_workerWait.Set() cuando se hace agregando puestos de trabajo. Esta solución (aparentemente) comienza a procesar los trabajos al instante, y la demora desaparece por completo.

Mi pregunta es en parte "¿Por qué sucede esto?"Thread.Sleep(int) puede dormir muy bien por más tiempo de lo que usted especifica, y en parte "¿Cómo funciona elManualResetEvent lograr este nivel de rendimiento? ".

EDITAR: Como alguien preguntó sobre la función que está en la cola de elementos, aquí está, junto con el sistema completo tal como está en este momento.

public void RunTriggers(string data)
{
    lock (this.SyncRoot)
    {
        this.Triggers.Sort((a, b) => { return a.Priority - b.Priority; });

        foreach (Trigger trigger in this.Triggers)
        {
            lock (Jobs)
            {
                Jobs.Enqueue(new TriggerData(this, trigger, data));
                _workerWait.Set();
            }
        }
    }
}

static private ManualResetEvent _workerWait = new ManualResetEvent(false);
static void WorkThread()
{
    while (working)
    {
        TriggerData job = null;

        lock (Jobs)
        {
            if (Jobs.Count > 0)
                job = Jobs.Dequeue();

            if (job == null)
            {
                _workerWait.Reset();
            }
        }

        if (job == null)
            _workerWait.WaitOne();
        else
        {
            try
            {
                foreach (Match m in job.Trigger.Regex.Matches(job.Data))
                    job.Trigger.Value.Action(job.World, m);
            }
            catch (Exception ex)
            {
                job.World.SendLineToClient("\r\n\x1B[32m -- {0} in trigger ({1}): {2}\x1B[m",
                    ex.GetType().ToString(), job.Trigger.Name, ex.Message);
            }
        }
    }
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta