Windows Phone 7是否允许异步编程?

3

我正在为wp7构建一款新闻阅读器应用程序。我希望进行一些后台活动,比如将下载的内容写入隔离存储。有没有办法在不阻塞UI线程的情况下实现这一点?

WebClientDownloadStringCompleted事件是异步的,对吗?我可以在那里做吗?

4个回答

3

它是异步的,但建议不要使用WebClient进行任何非平凡的处理,因为如Indy所指出的那样,这项工作将在UI线程上完成。

Webclient这样做是为了为您提供方便,以免您必须调用Dispatcher。

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

这样做的代价是回调中所有处理都在UI线程上执行。

HttpWebRequest(WebClient本身使用)将允许您将大部分处理保持在UI线程之外,并通过Dispatcher(参见上文)在UI线程上进行UI更新。

请注意,如果您过度使用此方法,仍然会阻塞UI线程。通过Thread.Sleep(xxx)间隔您的UI更新将有助于在这种情况下保持UI响应。

要深入了解HttpWebRequest和WebClient之间的差异以及演示工作项目示例,请参见我的帖子。

Windows Phone 7上的WebClient、HttpWebRequest和UI线程


0
是的,它可以。这里是如何在WP7上将异步特性暴露给任何类型的方法。

0

-1

在WP7中,所有的网络访问都是异步的,大多数网络API类甚至不公开同步方法,你必须非常努力地尝试去应对这个框架。

正如其他答案中所指出的,你需要注意的是,你需要通过UI线程更新UI,如果你正在使用代码后台,则可以使用Dispatcher.BeginInvoke。如果你正在使用某种MVVM样式模式,那么INotifyPropertyChanged事件会自动分派回UI线程,因此你不需要担心它(ObservableCollection的INotifyCollectionChanged原因未知)。


不幸的是,INotifyPropertyChanged事件不会分派到UI线程。 - Viacheslav Smityukh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接