none
Windows Phone 7 - stratégies d'accès aux données : comment détecter la connexion et la bande passante RRS feed

Toutes les réponses

  • Vérifier l’existence d’une connexion

    Lorsque vous devez établir une connexion à internet, la première vérification est la présence du réseau. Il y a deux stratégies, que vous pouvez adopter:

    a) vous pouvez vérifier la connectivité réseau juste avant l'envoi de la demande et donner une alerte à l'utilisateur. C'est mieux ciblé lorsque vous avez besoin afin d'éviter des erreurs de connexion pour les transactions uniques et atomiques.

    b) vous pouvez surveiller le réseau et réagir lorsqu'il il change l'état. C'est le cas d'une application intelligente où vous devez stocker vos données localement et ensuite accéder au réseau pour faire une synchronisation avec la base de données du serveur.

    Windows Phone prend en charge les deux scénarios avec plusieurs classes. Dans le premier scénario, où vous devez vous assurer que le réseau est disponible est assez simple. À l'aide de la classe NetworkInterface vous pouvez obtenir des informations simples sur la connexion. La méthode GetIsNetworkAvailable retourne true ou false si vous êtes connecté ou non.

    bool isThereNetwork = Microsoft.Phone.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();
    
     if (isThereNetwork)
      {
          // start your network operation
      }
      else MessageBox.Show("Unable to connect to the network");
    
    
     

    Avec cette méthode vous devez être conscient que la connexion USB à l'ordinateur portable est une connexion réseau valide. Ainsi, de faire un test, vous devez déployer l'application sur le périphérique, puis  se déconnecter du PC. Si vous ne déconnectez pas le dispositif de la méthode GetIsNetworkAvailable retourne toujours true, n'importe si vous avez ou pas le réseau de votre téléphone Windows Phone.

    Pour appuyer le scénario où vous devez surveiller la connectivité pour savoir quand faire une synchronisation, il est inutile d'appeler la méthode ci-dessus sur une base régulier. Au lieu de cela, vous pouvez compter sur la classe NetworkChange qui ont un événement NetworkAddressChanged, déclenché lorsque quelque chose se passe sur votre connexion.

    .
     public MainPage()
      {
          InitializeComponent();
          NetworkChange.NetworkAddressChanged += new NetworkAddressChangedEventHandler(NetworkChange_NetworkAddressChanged);
      }
    
      void NetworkChange_NetworkAddressChanged(object sender, EventArgs e)
      {
          bool isThereNetwork = Microsoft.Phone.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();
       
          message.Text = DateTime.Now.ToLongTimeString() + " - " + (isThereNetwork ? "Network is online" : "Network is offline");
      }
    

    L’événement NetworkAddressChanged ne signifie pas directement que votre connexion a tourné ON ou OFF, comme le suggère le nom de l'événement, mais cela signifie que quelque chose a changé dans les interfaces réseau et vous devriez faire un test pour vérifier que le réseau est encore disponible. C'est la raison pour lequel dans le corps du gestionnaire d'événements, on fait un test avec la méthode GetIsNetworkAvailable qui nous tiens au courant sur l'état réel de la connexion.

    Si vous faites quelques essais, sur le mode avion de commutation et de se connecter et débrancher le câble USB pour simuler la poursuivies de réseau, vous observera que, une fois que vous vous reconnectez au réseau, il existe des événements de retour arrière de la NetworkChange classe et seul le dernier est déclenché lorsque la connexion est revenue ON.


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    lundi 10 octobre 2011 11:42
  • Planifier la bande passante

    Il y a certainement des situations où, même si un réseau est disponible, vous ne pouvez pas l’utiliser pour fournir les informations que vous devez envoyer au serveur. Imaginez avoir un fichier .xml énorme qui a besoin d'être envoyé par un grand nombre de transactions d'une façon atomique ou une mise à jour d'une base de données locale qui implique le déplacement d'un grand nombre d'octets à travers le réseau. Dans ces cas, vous devez vous assurer que le réseau n'est pas seulement disponible mais aussi qu'il est tellement plus stable et plus rapide d'accorder une communication fiable pour déplacer vos données.

    Par exemple, vous pouvez planifier rendre la synchronisation uniquement lorsque le périphérique est ancré à son ordinateur portable : vous pouvez compter sur un réseau vraiment rapide ou aussi vous pouvez attendre d'avoir une connexion wi-fi et de prévenir les tâches de synchronisation de se produire au cours d'une connexion GPRS/UMTS normale.

    La classe NetworkInterface fournit une propriété NetworkInterfaceType qui permet de connaître le type de réseau que vous utilisez. Cette propriété représente un énumérateur qui expose un certain nombre de types de connexions. À partir de None, que ne signifie aucun lien disponible, vous pouvez trouver beaucoup de valeurs comme Ethernet (généralement lorsque amarré), MobileBroadbandGsm (GPRS/EDGE/UMTS/HSDPA/HSPA), Wireless80211 (pendant les connexions wi-fi) et ainsi de suite. Le code pour récupérer cette information est simple :

    private void NetworkChange_NetworkAddressChanged(object sender, EventArgs e)
      {
         NetworkInterfaceType interfaceType = NetworkInterface.NetworkInterfaceType;
    
         message.Text = interfaceType.ToString();
      }
    
    

    Malheureusement, les choses ne sont pas si faciles. Le problème ici est que l'appel à NetworkInterfaceType est synchrone, et il peut prendre beaucoup du temps pour renvoyer la valeur. Donc vous essayez d'accomplir cette tâche dans le thread d'interface utilisateur vous pouvez geler la demande pour un temps entre 10 et 20 secondes et cela est totalement erroné. Cela implique aussi l'échec de votre application dans le processus de soumission sur le marché car la réceptivité de l'interface utilisateur au cours de l'opération de réseau est un must.

    Pour contourner ce problème, vous devez utiliser un thread séparé pour accéder à la propriété et ensuite mettre en cache localement les informations requises. Voici un extrait qui utilise un thread pour lire NetworkInterfaceType :

    private void NetworkChange_NetworkAddressChanged(object sender, EventArgs e)
      {
          ThreadPool.QueueUserWorkItem(
              o =>
              {
                  try
                  {
                      NetworkInterfaceType interfaceType = NetworkInterface.NetworkInterfaceType;
    
                      Deployment.Current.Dispatcher.BeginInvoke(() => this.UpdateNetworkInfo(interfaceType));
                  }
                  catch (Exception ex)
                  {
                     Deployment.Current.Dispatcher.BeginInvoke(() => this.HandleExceptions(ex));
                  }  
             }, null);
      }
    
    
     

    En utilisant le pool de threads, vous aurez un certain nombre de thread a engendré une fois le réseau va changer son état afin que vous ayez à planifier soigneusement l'accès à l'information en mémoire cache partagée qui sera écrit en même temps.


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    lundi 10 octobre 2011 11:48