2010-11-01 3 views
3

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

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

ответ

0

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

3

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

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

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

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

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

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

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

WebClient, HttpWebRequest and the UI Thread on Windows Phone 7

-1

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

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

+0

К сожалению, события INotifyPropertyChanged не отправляются в поток пользовательского интерфейса –

0

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

Смежные вопросы