2010-11-01 61 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上的任何類型。