ManualResetEvent vs. Thread.Sleep

Eu implementei o seguinte thread de processamento de plano de fundo, ondeJobs é umQueue<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.
        }
    }
}

Isso produziu um atraso perceptível entre quando os trabalhos estavam sendo inseridos e quando eles estavam realmente começando a ser executados (lotes de trabalhos são inseridos de uma vez, e cada trabalho é apenas [relativamente] pequeno.) O atraso não foi um grande problema, mas comecei a pensar sobre o problema e fiz a seguinte alteração:

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

Onde o encadeamento adicionando tarefas agora bloqueia_workerWait e chama_workerWait.Set() quando é feito adicionar trabalhos. Essa solução (aparentemente) inicia instantaneamente o processamento de tarefas e o atraso desaparece completamente.

Minha pergunta é em parte "Por que isso acontece?"Thread.Sleep(int) pode muito bem dormir por mais tempo do que você especifica, e em parte "Como é que oManualResetEvent alcançar este nível de desempenho? "

EDITAR: Já que alguém perguntou sobre a função que está enfileirando itens, aqui está, junto com o sistema completo como está no 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);
            }
        }
    }
}

questionAnswers(2)

yourAnswerToTheQuestion