[WP7] Missing CheckAccess()

Posted by & filed under Non classé.

Une petite note technique pour ceux qui se demandaient où était passée Dispatcher.CheckAccess() dans les CTP de Windows Phone 7.

Cette primitive permet de savoir si le code courant tourne dans le thread d’UI ou pas, et donc si un BeginInvoke() est nécessaire ou pas.

Exemple, pour récupérer un setting de l’IsolatedStorage depuis n’importe quel thread :

public void GetSetting(string key, out object value)
        {
            if (Deployment.Current.Dispatcher.CheckAccess())
            {
                value = IsolatedStorageSettings.ApplicationSettings[key];
            }
            else
            {
                using (ManualResetEvent sync = new ManualResetEvent(false))
                {
                    object _value = null;

                    Deployment.Current.Dispatcher.BeginInvoke(() =>
                        {
                            _value = IsolatedStorageSettings.ApplicationSettings[key];
                            sync.Set();
                        });

                    sync.WaitOne();
                    value = _value;
                }
            }
        }

Et bien CheckAccess() est toujours bien là dans la classe Dispatcher, même si l’Intellisense de Visual Studio ne vous la propose pas.

Rappel : Pour les débutants en multi-threading sous Silverlight, le seul Dispatcher auquel vous avez accès depuis un autre thread que l’UI est Deployment.Current.Dispatcher. Si vous essayez de taper directement dans le Dispatcher d’un FrameworkElement vous irez tout droit à la CrossThreadException ;-).

Source : Forums MSDN

Ready-made usual flavour HttpWebRequest for Windows Phone 7

Posted by & filed under Sources.

Si vous effectuez des portages d’applications .NET vers Silverlight ou Windows Phone 7, cette classe pourrait bien vous être utile.
En effet, dans Silverlight, les WebRequests sont asynchrones (c’est très bien !), seulement ce changement d’API peut causer de nombreuses modifications de code. C’est dans cette optique que j’ai crée cette classe C# : HttpWebRequestSync qui propose une interface au plus proche de ce qui existait avant.

Attention, pour le coup vous perdrez l’avantage des requêtes asynchrones et votre thread appelant sera bloqué pendant le déroulement de la requête, comme au bon vieux temps !
Tout retour de bug ou message de remerciement est le bienvenu, ce code est disponible sous licence LGPL.

If you’re looking forward to port .NET applications to Silverlight/Windows Phone 7, the following might interest you.
In Silverlight, the WebRequests are asynchronous (and that’s a good thing), but this change in the API can cause numerous changes in your code. That’s what lead me to write this C# class : HttpWebRequestSync featuring an interface as close as possible as what was there before.

Note that you’ll lose the advantage of asynchronous requests and that you’re thread will be locked waiting for the request to complete, ol’school style.
If you find any bug or just want to leave a ‘thank you’ not you’re welcome. This code is available under the LGPL license.

Read more »