Mango : attention au WebClient !!!

Mango : attention au WebClient !!!

Mango apporte pleins de nouvelles fonctionnalité et promet une retro compatibilité avec les anciennes applications sous “Nodo” and Co.

Dans les faits c’est le cas, enfin presque…

Le problème

Vous savez déjà que je ne suis pas fan de WebClient, je préfère l’utilisation des WebRequests car on est des hommes, des vrais… non sérieux, car il permet plus de contrôles.

Revenons au fait : WebClient va poser des problèmes dans l’état quand vous ferez la mise à jour Mango, car en effet, il va être légèrement modifié pour moins occuper le thread UI (et donc avec une plus grande fluidité dans son IHM).

Auparavant, lorsque l’on utilisait un WebClient, les callbacks étaient toujours appelées dans le thread UI, quelque soit le thread d’appel original. Avec mango, si le WebClient les callbacks sont appelés dans des threads semblables au thread appelant. Donc si WebClient est appelé dans un thread différent de UI, la réponse ne sera pas dans le thread UI, donc si je manipule des contrôles utilisateurs ou des propriétés qui sont bindées à des contrôles utilisateurs, une exception de type UnauthorizedAccessException “Invalid cross-thread access.” va être lancée.

Solution

Avant tout, précisons que le SDK est en version beta, il est possible que les webclient évoluent ou soit doublé (WebClientEx ?). Voir même : le téléphone reconnaitra que l’application est pré-mango et donc utilisera l’ancienne implémentation de WebClient.

Toutefois, pour éviter ce problème, il faut utiliser un dispatcher autour des instructions intéragissant avec l’UI dans les callbacks des webclients lancés dans les thread non UI :

BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += (senderb, eb) =>{
WebClient wc = new WebClient();
wc.DownloadStringCompleted += (senderr, er) =>
{
//actions n'utilisant pas l'ui ou des propriétés bindés
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
//actions utilisant l'ui ou des propriétés bindés
}, null);
};
wc.DownloadStringAsync(new Uri("http://create.msdn.com", UriKind.Absolute));};
bw.RunWorkerAsync();

Si le SDK reste ainsi, pensez dès maintenant à ajouter ces instructions de dispatcher si vous ne voulez pas rencontrer de problèmes avec mango

Comments are closed.