2010-11-01 5 views
3

Je construis une application lecteur de nouvelles pour wp7. J'aimerais avoir une activité en arrière-plan, comme écrire du contenu téléchargé sur un stockage isolé. Est-il possible de le faire sans bloquer le thread d'interface utilisateur?Est-ce que Windows Phone 7 autorise la programmation asynchrone?

L'événement DownloadStringCompleted de WebClient est asynchrone, n'est-ce pas? Est-ce que je pourrais juste le faire là?

Répondre

0

Vous pouvez certainement mettre à jour l'interface utilisateur à l'aide de Dispatcher.BeginInvoke method, pour éviter les exceptions d'interconnexion. Il est toutefois conseillé d'utiliser HttpWebRequest au lieu de WebClient car WebClient renvoie sur le thread d'interface utilisateur. Here is a recent MSDN Blog post qui pourrait vous aider à comprendre le modèle et peut-être aider à développer votre application.

3

Il est asynchrone, mais il est recommandé de ne pas effectuer de traitement non trivial à l'aide de WebClient car ce travail sera effectué sur le thread de l'interface utilisateur comme Indy le signale à juste titre. Webclient fait cela pour vous offrir la commodité de ne pas avoir à appeler Dispatcher.

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

Cela vient au prix de tous vos traitement dans le rappel en cours d'exécution sur le thread d'interface utilisateur. HttpWebRequest (utilisé par WebClient lui-même) vous permettra de garder la plus grande partie de votre traitement hors de l'UI thread et de simplement faire vos mises à jour UI sur le thread UI par l'intermédiaire de Dispatcher (voir ci-dessus).

Notez que vous pouvez toujours bloquer le thread UI si vous faites cela avec trop d'intensité. L'espacement de vos mises à jour de l'interface utilisateur avec Thread.Sleep (xxx) aidera à garder l'interface utilisateur responsable dans de tels cas.

Pour une compréhension plus approfondie des différences entre HttpWebRequest et WebClient et un exemple de projet de travail à démontrer, consultez mon article ici.

WebClient, HttpWebRequest and the UI Thread on Windows Phone 7

-1

Tous les accès réseau dans WP7 est asynchrone, la plupart des classes de l'API réseau n'exposez même pas des méthodes synchrones, vous devez combattre le cadre assez difficile d'essayer en fait.

Comme indiqué dans les autres réponses, vous devez savoir que vous devez mettre à jour l'interface utilisateur via le thread d'interface utilisateur. Vous pouvez utiliser Dispatcher.BeginInvoke si vous utilisez le code-behind. Si vous utilisez un type de modèle de style MVVM, les événements INotifyPropertyChanged sont automatiquement renvoyés dans le thread d'interface utilisateur afin que vous n'ayez pas à vous en soucier (INotifyCollectionChanged de ObservableCollection n'est pas connu pour des raisons inconnues).

+0

Malheureusement, les événements INotifyPropertyChanged ne sont pas envoyés au thread d'interface utilisateur –

0

Oui, c'est le cas. Here est comment vous pouvez exposer des fonctionnalités asynchrones à tout type sur WP7.