WPF использует Dispatcher
для контроля доступа к насосу сообщений, а не для того, чтобы каждый элемент управления отвечал за доступ к потоку пользовательского интерфейса.
Вы должны использовать Dispatcher.Invoke
для добавления делегата в поток пользовательского интерфейса в приложении WPF.
Также стоит отметить, что InvokeRequired
действительно не требуется в приложении winform, и это не то, что вы должны проверять в приложении WPF. Вы должны знать, что вы не находитесь в потоке пользовательского интерфейса, когда звоните Invoke
. Вы никогда не должны находиться в ситуации, когда данный метод иногда вызывается из потока пользовательского интерфейса и иногда вызывается из фонового потока. Выбери один; либо всегда заставляют вызывающего абонента ссылаться на поток пользовательского интерфейса перед вызовом заданного метода (поэтому вам не нужно вызывать) или предположить, что вызывающий объект не будет в потоке пользовательского интерфейса при вызове метода. Также стоит отметить, что вызов Invoke
, когда вы уже находитесь в потоке пользовательского интерфейса, просто замечательный. Ошибок или проблем, которые могут возникнуть из-за случайного экземпляра повторного вызова потока пользовательского интерфейса, не существует. Это незначительная стоимость исполнения, поэтому просто не добавляйте ненужный код для всего этого места.
Конечно, есть много ситуаций, когда вы не знаете, находитесь ли вы в создании потока или нет, и вам нужно его проверить! – Christoph
Когда-либо создавался пользовательский контроль, который позволяет привязываться к данным? Обычно данные извлекаются другим потоком, но, например, установка значения текстового поля также может быть выполнена другим элементом управления (например, изменение выпадающего списка в другом значении по умолчанию =>, которое вы используете в потоке пользовательского интерфейса. Назначение значения из базы данных => вы находитесь в рабочем потоке) – Christoph
путь, НЕ используйте Invoke(), вместо этого используйте BeginInvoke() (как в WinForms, так и в WPF). Причина в том, что Invoke() может уступать уродливым мертвым замкам. – Christoph