Если ваш код выполняется в службе, избегайте использования Application.DoEvents (), потому что, среди прочих причин, требуется добавить ссылку System.Windows.Forms.
Что касается комментария, предлагающего WaitHandle.WaitOne (), я не думаю, что он будет работать, потому что он не очищает канал сообщений Windows.
3 функции PeekMessage, TranslateMessage и DispatchMessage:необходимо, потому что DicomNet нашего SDK использует сообщения Windows, поэтому вы должны прокачать очередь сообщений, чтобы найти сообщение DICOM, смешанное с сообщениями Windows.WaitHandle не собирается ничего делать с очередью сообщений Windows.
Использование этих трех функций - это один и тот же насос сообщений, который существует во всех приложениях Windows, независимо от того, какие уровни новых технологий добавляются к ним за эти годы (например, .NET Framework).Это версия самого низкого уровня и, следовательно, самая легкая.
Если есть что-то, что я бы изменил, это использовать GetMessage вместо PeakMessage для прокачки сообщений.Это потенциально повысит производительность и снизит загрузку ЦП.В этом сообщении на форуме есть демонстрационный проект, использующий этот подход .Сообщение старое, но концепция рассылки сообщений все та же.
Примечание. Если вы используете текущую версию 20 LEADTOOLS, новый метод DicomNet.Breathe былдобавлено, чтобы вам не приходилось использовать extern's.Этот метод просто реализует стандартный насос сообщений Windows.