Разрешает ли Windows Phone 7 асинхронное программирование? - PullRequest
3 голосов
/ 01 ноября 2010

Я создаю приложение для чтения новостей для wp7.Я хотел бы, чтобы произошла некоторая фоновая активность, например, запись загруженного контента в изолированное хранилище.Есть ли способ сделать это без блокировки потока пользовательского интерфейса?

Событие DownloadStringCompleted для WebClient является асинхронным, верно?Могу ли я просто сделать это там?

Ответы [ 4 ]

3 голосов
/ 01 ноября 2010

Он асинхронный, но рекомендуется не выполнять никакой нетривиальной обработки с использованием WebClient, поскольку эта работа будет выполняться в потоке пользовательского интерфейса, как справедливо отмечает Indy.

Webclient делает это, чтобы вам было удобнее не вызывать Диспетчер.

Dispatcher.BeginInvoke( () => { /* ui update code */ } );

Это происходит за счет ВСЕХ вашей обработки в обратном вызове, выполняемом в потоке пользовательского интерфейса.

HttpWebRequest (используется самим WebClient) позволит вам сохранить большую часть обработки вне потока пользовательского интерфейса и просто обновлять пользовательский интерфейс в потоке пользовательского интерфейса с помощью диспетчера (см. Выше).

Обратите внимание, что вы все еще можете заблокировать поток пользовательского интерфейса, если вы делаете это с слишком большой интенсивностью. Интервал обновления вашего пользовательского интерфейса с помощью Thread.Sleep (xxx) поможет сохранить пользовательский интерфейс в таких случаях.

Для более глубокого понимания различий между HttpWebRequest и WebClient и примера работающего проекта, см. Мой пост здесь.

WebClient, HttpWebRequest и поток пользовательского интерфейса на Windows Phone 7

0 голосов
/ 16 января 2011

Да, это так. Здесь - это способ предоставления асинхронных функций любому типу в WP7.

0 голосов
/ 01 ноября 2010

Весь доступ к сети в WP7 является асинхронным, большинство классов API-интерфейсов сети даже не предоставляют синхронных методов, вам приходится довольно сильно бороться с фреймворком, чтобы попробовать его на самом деле.

Как отмечалось в других ответах, вы должны знать, что вам нужно обновить интерфейс через поток пользовательского интерфейса, вы можете использовать Dispatcher.BeginInvoke, если вы работаете с выделенным кодом.Если вы используете какой-то шаблон стиля MVVM, события INotifyPropertyChanged автоматически отправляются обратно в поток пользовательского интерфейса, поэтому вам не нужно об этом беспокоиться (INotifyCollectionChanged из ObservableCollection не по неизвестным причинам).

0 голосов
/ 01 ноября 2010

Конечно, вы можете обновить пользовательский интерфейс, используя Dispatcher.BeginInvoke метод , чтобы избежать межпоточных исключений.Тем не менее, желательно использовать HttpWebRequest вместо WebClient, поскольку WebClient возвращается в потоке пользовательского интерфейса. Вот недавнее сообщение в блоге MSDN , которое может помочь вам понять модель и, возможно, помочь в разработке вашего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...