Как протолкнуть цикл сообщений в 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.