Для начала нужно понять, как работают приложения WinForms в целом. Глубоко в недрах вызова Application.Run находится фрагмент кода, часто называемый насосом сообщений. Это бесконечный цикл, который вызывает GetMessage, TranslateMessage и DispatchMessage. Application.DoEvents, по сути, вызывает один цикл этого цикла. Цикл DoEvents, на который вы смотрите, просто выполняет эту операцию.
Теперь, почему именно этот звонок даже необходим, я не могу честно сказать. Это довольно плохо с тех пор, как я написал код , но в мою защиту этому коду уже почти десять лет, и я едва помню, что делал на прошлой неделе.
Если удалить петлю, что произойдет? Я не вижу ничего, что указывало бы на то, что вы могли бы рисовать артефакты рисования или сбои рисования (что является типичной причиной добавления вызова), но этот код был также написан в CFan 1.0, так что вполне возможно, что нужно было преодолеть ограничение времени выполнения.
Что бы это ни стоило, я пересмотрел и переписал код в 2009 , и в переписанном коде нет цикла (или даже метода Run).
Кстати, в Push есть ошибка, которую я вижу. Цикл foreach имеет return
без выполнения Monitor.Exit. Вероятно, я бы переписал этот метод для использования блока lock
или finally
для вызова Monitor.Exit.