Для этого вы можете использовать ManualResetEvent .
Поток, который должен обработать сначала, просто берет resetEvent и ждет до конца, чтобы установить событие.
Поток, который должен ждать, может содержать дескриптор и вызывать resetEvent.WaitOne (). Это будет блокировать этот поток, пока не завершится первый.
Это позволяет очень аккуратно обрабатывать блокировку и упорядочение событий.