Основное различие между Thread.Sleep
и ManualResetEvent.WaitOne
заключается в том, что вы можете сигнализировать потоку, ожидающему ManualResetEvent используя Set метод, заставляя поток проснуться раньше, чем время ожидания.
Если вы не дадите сигнал, я бы ожидал, что они будут вести себя очень похожим образом.
Из .NET Reflector Я вижу, что метод ManualResetEvent.WaitOne
в конечном итоге приводит к вызову метода extern со следующей сигнатурой:
int WaitOneNative(SafeWaitHandle waitHandle,
uint millisecondsTimeout,
bool hasThreadAffinity,
bool exitContext);
Принимая во внимание, что Thread.Sleep
вызывает этот метод extern:
void SleepInternal(int millisecondsTimeout);
К сожалению, у меня нет исходного кода для этих методов, поэтому я могу только догадываться. Я полагаю, что в обоих вызовах поток будет запланирован, пока он ожидает истечения времени ожидания, причем ни один из них не будет особенно точным, чем другой.