我正在爲wp7構建新聞閱讀器應用程序。我希望發生一些後臺活動,例如將下載的內容寫入獨立存儲。有沒有辦法做到這一點,而不阻止UI線程?Windows Phone 7是否允許異步編程?
DownloadStringCompleted
事件WebClient
是異步的,對不對?我可以在那裏做嗎?
我正在爲wp7構建新聞閱讀器應用程序。我希望發生一些後臺活動,例如將下載的內容寫入獨立存儲。有沒有辦法做到這一點,而不阻止UI線程?Windows Phone 7是否允許異步編程?
DownloadStringCompleted
事件WebClient
是異步的,對不對?我可以在那裏做嗎?
您當然可以使用Dispatcher.BeginInvoke method來更新UI,以避免跨線程異常。但是,由於WebClient在UI線程上返回,因此建議使用HttpWebRequest而不是WebClient。 Here is a recent MSDN Blog post這可以幫助您瞭解模型,並可能有助於開發您的應用程序。
它是異步的,但建議不要使用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
WP7中的所有網絡訪問是異步的,大部分的網絡API類甚至不暴露同步方法,你要爭取的框架相當困難其實嘗試。
正如其他答案中指出的那樣,您必須注意的是您需要通過UI線程更新UI,如果您使用的是代碼隱藏功能,則可以使用Dispatcher.BeginInvoke。如果您使用的是某種MVVM樣式模式,那麼INotifyPropertyChanged事件會自動發送回UI線程,因此您不必擔心它(從ObservableCollection獲取INotifyCollectionChanged的原因不明)。
是的,它的確如此。 Here是如何將異步功能展示給WP7上的任何類型。
不幸的是,INotifyPropertyChanged事件不會發送到UI線程 – 2014-02-25 08:54:20