我正在为wp7构建一款新闻阅读器应用程序。我希望进行一些后台活动,比如将下载的内容写入隔离存储。有没有办法在不阻塞UI线程的情况下实现这一点?
WebClient
的DownloadStringCompleted
事件是异步的,对吗?我可以在那里做吗?
我正在为wp7构建一款新闻阅读器应用程序。我希望进行一些后台活动,比如将下载的内容写入隔离存储。有没有办法在不阻塞UI线程的情况下实现这一点?
WebClient
的DownloadStringCompleted
事件是异步的,对吗?我可以在那里做吗?
它是异步的,但建议不要使用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之间的差异以及演示工作项目示例,请参见我的帖子。
在WP7中,所有的网络访问都是异步的,大多数网络API类甚至不公开同步方法,你必须非常努力地尝试去应对这个框架。
正如其他答案中所指出的,你需要注意的是,你需要通过UI线程更新UI,如果你正在使用代码后台,则可以使用Dispatcher.BeginInvoke。如果你正在使用某种MVVM样式模式,那么INotifyPropertyChanged事件会自动分派回UI线程,因此你不需要担心它(ObservableCollection的INotifyCollectionChanged原因未知)。