Как нажать цикл сообщений в WinForms?

В WPF я могу запустить цикл сообщений, используя Dispatcher.PushFrame.

Что эквивалентно в WinForms? Я знаком с DoEvents, но это должно вызываться в цикле, который может вращать ЦП, вместо очень эффективного подхода, заключающегося в простом ожидании сообщения или события, сигнализирующего о выходе (как Dispatcher.PushFrame).


person Andrew Arnott    schedule 01.02.2016    source источник
comment
Нет ни одного, ShowDialog() настолько близок, насколько это возможно. Я некоторое время искал альтернативы, но повторный вход вызвал слишком много проблем.   -  person Hans Passant    schedule 01.02.2016
comment
Я остановился на DoEvents в цикле со Sleep, чтобы ЦП не вращался до высоких значений.   -  person Andrew Arnott    schedule 06.02.2016


Ответы (2)


Я смог включить WindowsBase в ссылки моего проекта и просто использовать Dispatcher.PushFrame и frame.Continue = false как обычно.

Применяются любые предостережения относительно взаимодействия wpf-winforms, и для этого требуется ссылка на часть wpf, но он все же должен быть лучше, чем DoEvents (у которого есть серьезные подводные камни).

person secondperson    schedule 07.09.2019

Это эквивалент:

        System.Threading.SendOrPostCallback callback = o =>
        {
            this.Text = "Hello" + o.ToString(); // "Hello42"
        };
        WindowsFormsSynchronizationContext.Current.Post(callback, 42);

42 — это параметр state, который передается обратному вызову.

Вы также можете сделать это:

        this.BeginInvoke((Action)(() => this.Text = "Hello"));

Кстати, вы никогда не должны использовать DoEvents - это отличный способ внести ошибки в ваш код, и на самом деле он предназначен только для совместимости с VB6.

person Enigmativity    schedule 01.02.2016
comment
Нет, это не эквивалент. Это просто отправка сообщения. Мой вопрос заключается в том, как запустить цикл сообщений, который будет обрабатывать такое сообщение. Я согласен с тем, что DoEvents является исключительно проблематичным, и я избегаю его, как чумы. Тем не менее, для этого модульного теста, который я пишу, мне не нужно беспокоиться об обработке случайных сообщений, и мне нужно имитировать события обработки потока пользовательского интерфейса, поскольку на самом деле нет основного цикла обработки сообщений. в моем модульном тесте. - person Andrew Arnott; 06.02.2016