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

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

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

1 ответ

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

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

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

        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.

Другие вопросы по тегам