Надеюсь, никогда. Но это тот код, который вы должны писать , когда хотите, чтобы поток пользовательского интерфейса блокировал объекты синхронизации. Поток пользовательского интерфейса не разрешается блокировать, Windows не позволяет вам вызывать WaitForMultipleObjects (). Причина в том, что очень может вызвать тупик.
Причиной этого является COM. COM везде в Windows, наиболее распространенными примерами являются буфер обмена, перетаскивание и диалоги оболочки. Вызовы методов интерфейса COM marshals, сделанные из рабочего потока для объектов COM, которые живут в STA (Single Threaded Apartment) с помощью цикла сообщений. Если поток STA не перекачивает сообщения, то вызов не будет завершен. И звонки, которые не могут быть завершены, являются ингредиентом номер один для тупика. Добавьте поток пользовательского интерфейса, который ожидает завершения рабочего потока, и гарантируется взаимоблокировка.
Вы избегаете такого рода кода, когда рабочий поток использует PostMessage (), чтобы сигнализировать потоку пользовательского интерфейса, что произошло что-то важное.