Просто используйте одно событие автоматического сброса, которое устанавливается, когда завершается какой-либо поток (либо нормально, либо с исключением). Имеют две целочисленные переменные (общие для всех потоков): threadCompletedNormallyCount и threadCompletedAbnormallyCount. Когда поток завершает, он увеличивает одну из этих двух переменных, используя Interlocked.Increment, чтобы указать, как он завершил, а затем устанавливает событие.
Когда третий поток просыпается, он может проверить эти переменные, чтобы увидеть, нужно ли ему выйти (то есть оба потока завершились нормально или хотя бы один ненормально, хотя что вы собираетесь делать с незавершенным потоком в последнем случае?) , Если только один поток завершил нормально, он должен снова спать.