Я создаю приложение WPF. Я делаю некоторую асинхронную связь со стороной сервера, и я использую агрегирование события с Призмой на клиенте. Обе этих вещи приводят к новым потокам, которые будут порождены, которые не являются потоком UI. Если я попытаюсь сделать "операции WPF" на них обработчик обратного вызова и потоки обработчика событий, то мир развалится, который он теперь начал делать.
Сначала я встретил проблемы, пытающиеся создать некоторые объекты WPF в обратном вызове с сервера. Мне сказали, что поток должен был работать в режиме STA. Теперь я пытаюсь обновить некоторые данные UI в обработчике событий Призмы, и мне говорят что:
Вызывающая сторона не может получить доступ к этому потоку, потому что другой поток владеет им.
Так; что ключ к разбиранию в вещах в WPF? Я читал на Диспетчере WPF в этом сообщении MSDN. Я начинаю получать его, но я еще не мастер.
Кто-либо хочет clearify вещи для меня? Какие-либо связанные рекомендации, и т.д.? Спасибо!
Рассматривая каждый из ваших вопросов один за другим:
вызывать
все. Ключ заключается в том, чтобы вызывать поток пользовательского интерфейса только в случае необходимости. Для этого можно использовать метод Dispatcher.CheckAccess . Invoke
, если это необходимо. При этом в некоторых случаях это неизбежно, поэтому нет, я бы вообще не сказал, что это плохая практика. Это всего лишь одно решение проблемы, с которой вы время от времени будете сталкиваться. Dispatcher.CurrentDispatcher
. Для сложных сценариев этого может быть недостаточно, но я (лично) их не видел.
может использоваться для получения доступа к потоку пользовательского интерфейса приложения. Но сам по себе он не является потоком пользовательского интерфейса. BackgroundWorker
обычно используется, когда у вас трудоемкая операция и вы хотите сохранить отзывчивый пользовательский интерфейс при выполнении этой операции в фоновом режиме. Обычно вы не используете BackgroundWorker вместо Invoke, скорее вы используете BackgroundWorker вместе с Invoke.То есть, если вам нужно обновить какой-либо объект пользовательского интерфейса в вашем BackgroundWorker, вы можете вызвать поток пользовательского интерфейса, выполнить обновление, а затем вернуться к исходной операции. О BackgroundWorker
можно много сказать, я уверен, что ему уже посвящено много вопросов, поэтому я не буду вдаваться в подробности. Если вам интересно, посетите страницу MSDN для класса BackgroundWorker .