2010-11-01 53 views
3

我正在为wp7构建新闻阅读器应用程序。我希望发生一些后台活动,例如将下载的内容写入独立存储。有没有办法做到这一点,而不阻止UI线程?Windows Phone 7是否允许异步编程?

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

回答

3

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

Webclient会这样做,为您提供无需调用分派器的便利。

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

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

HttpWebRequest(由WebClient自己使用)将允许您保持大部分处理不在UI线程中,只需通过Dispatcher(请参见上文)在UI线程上执行UI更新即可。

请注意,如果您以太高的强度执行此操作,仍然可以阻止UI线程。使用Thread.Sleep(xxx)间隔UI更新将有助于在这种情况下保持UI的响应。

为了深入了解HttpWebRequest和WebClient与工作项目样本之间的区别,请参考我的帖子。

WebClient, HttpWebRequest and the UI Thread on Windows Phone 7

-1

WP7中的所有网络访问是异步的,大部分的网络API类甚至不暴露同步方法,你要争取的框架相当困难其实尝试。

正如其他答案中指出的那样,您必须注意的是您需要通过UI线程更新UI,如果您使用的是代码隐藏功能,则可以使用Dispatcher.BeginInvoke。如果您使用的是某种MVVM样式模式,那么INotifyPropertyChanged事件会自动发送回UI线程,因此您不必担心它(从ObservableCollection获取INotifyCollectionChanged的原因不明)。

+0

不幸的是,INotifyPropertyChanged事件不会发送到UI线程 – 2014-02-25 08:54:20

0

是的,它的确如此。 Here是如何将异步功能展示给WP7上的任何类型。