Partager via


TIPS & TRICKS : Erreur « Access Denied » avec MessageDialog (WinRT)

 

Une application Windows 8 se doit de tester si le réseau est disponible, et dans le cas contraire afficher un message d’erreur du style.

notconnected

Code Snippet

  1. void DemoMessageDialogStandard()
  2.         {
  3.             if (NetworkInterface.GetIsNetworkAvailable())
  4.             {
  5.                 //Se connecte  internet et rapatrie des donnes
  6.             }
  7.          
  8.             else
  9.             {
  10.                 ShowNotConnectedMessage();
  11.             }
  12.         }
  13.  
  14.         void ReEssayer(Object userState)
  15.         {
  16.            
  17.                     DemoMessageDialogStandard();
  18.                            
  19.         }
  20.  
  21.           async voidShowNotConnectedMessage()
  22.         {
  23.           
  24.                 MessageDialog dialogError = new MessageDialog("Vous n'etes pas connect", "Erreur de connexion");
  25.                 IUICommand tryAgainCommand = new UICommand("r-essayer", ReEssayer);                                        
  26.                 dialogError.Commands.Add(tryAgainCommand);
  27.                 dialogError.DefaultCommandIndex = 0;
  28.                 await dialogError.ShowAsync();                     
  29.         }    
  30.     }

Néanmoins, si la méthode ShowNotConnectedMessage est rappelée une nouvelle fois, à partir de la méthode ReEssayer (pour le cas ou la connexion n’est toujours pas établie) , on obtient le magnifique message suivant :

Erreur 

Voici donc une classe MessageDialogEx, pour résoudre ce problème, à base de sémaphore et de pile concurrente pour éviter la réentrance sur la boite de dialogue.

Code Snippet

  1. class MessageDialogEx
  2. {
  3.     static ConcurrentStack<MessageDialog> _dialogs = new ConcurrentStack<MessageDialog>();
  4.     MessageDialog _dlg;
  5.     static SemaphoreSlim semaphore = new SemaphoreSlim(1);
  6.     public MessageDialogEx(String content, String title)
  7.     {
  8.  
  9.         _dlg = new MessageDialog(content, title);
  10.         _dialogs.Push(_dlg);
  11.  
  12.     }
  13.     public async Task ShowAsync()
  14.     {
  15.  
  16.         MessageDialog dlg;
  17.         await semaphore.WaitAsync();
  18.         _dialogs.TryPop(out dlg);
  19.         await dlg.ShowAsync();
  20.         semaphore.Release(1);
  21.     }
  22.     public IList<IUICommand> Commands
  23.     {
  24.         get { return _dlg.Commands; }
  25.  
  26.     }
  27.     public uint DefaultCommandIndex
  28.     {
  29.         get
  30.         {
  31.             return _dlg.DefaultCommandIndex;
  32.         }
  33.         set
  34.         {
  35.             _dlg.DefaultCommandIndex = value;
  36.         }
  37.     }
  38. }

Il suffit alors juste de remplacer dans la méthode ShowNotConnectedMessage, MessageDialog par MessageDialogEx

Code Snippet

  1. async voidShowNotConnectedMessage()
  2.       {
  3.         
  4.               MessageDialogEx dialogError = new MessageDialogEx("Vous n'etes pas connect", "Erreur de connexion");
  5.               IUICommand tryAgainCommand = new UICommand("r-essayer", ReEssayer);                                        
  6.               dialogError.Commands.Add(tryAgainCommand);
  7.               dialogError.DefaultCommandIndex = 0;
  8.               await dialogError.ShowAsync();                     
  9.       }    

 

Eric Vernié

Comments

  • Anonymous
    September 20, 2012
    I don't know French, but your post helped me :-). thank you !

  • Anonymous
    March 04, 2014
    Hello, Chouette implémentation merci :-) Je cherchais à résoudre ce problème mais ma version était plus "usine à gaz". Je remplacerais par contre le ConcurrentStack par un ConcurrentQueue histoire de dépiler les messages dans l'ordre d'arrivée (si par exemple 3 sont envoyés "à la suite").