2009-09-10 4 views
0

J'appelle et j'obtiens des résultats à partir d'un appel de service Web asynchrone qui fournit un tableau d'objets à afficher dans une grille sur un portable Windows Mobile.Windows Mobile 6.1 problèmes avec appel de service Web asynchrone et mise à jour de l'interface utilisateur

À un moment donné, l'interface utilisateur était correctement mise à jour en utilisant InvokedRequired et Invoke. Maintenant, la première fois que je lance l'émulateur et Visual Studio 2008, cela fonctionnera, mais les appels suivants semblent se bloquer sur l'appel de la méthode Invoke, aucun autre point d'arrêt n'étant frappé dans le code.

Cette application utilise le .Net CF 2.0 SP1 et cible un périphérique WinMo 6.1. Je suis récemment passé d'un environnement de développement virtuel exécutant XP à l'ordinateur portable hôte qui exécute Vista.

private delegate void UpdateGrid(WebServiceItems[] items); 

private void DoGridUpdate(WebServiceItems[] items) 
    { 
     // Choose the correct grid based on the tab index 
     DataGrid grid; 
     if (tabSelectedIndex == 0) 
      grid = gridA; 
     else 
      grid = gridB; 

     if (grid.InvokeRequired) 
     { 
      grid.Invoke(new UpdateGrid(DoGridUpdate), new object[] { items }); 

      return; 
     } 

     Cursor.Current = Cursors.Default; 
     grid.DataSource = items; 
     if (items.Length > 0) 
     { 
      DataGridTableStyle tableStyle = new DataGridTableStyle(); 
      tableStyle.MappingName = items.GetType().Name; 

      DataGridTextBoxColumn column = new DataGridTextBoxColumn(); 
      column.Width = 230; 
      column.MappingName = "Column1"; 
      column.HeaderText = "Column1"; 
      tableStyle.GridColumnStyles.Add(column); 

      column = new DataGridTextBoxColumn(); 
      column.Width = 70; 
      column.MappingName = "Column2"; 
      column.HeaderText = "Column2"; 
      tableStyle.GridColumnStyles.Add(column); 

      grid.TableStyles.Clear(); 
      grid.TableStyles.Add(tableStyle); 
     } 
    } 
+0

J'ai changé le code de bloc if pour ceci. Cela a fonctionné une fois donc j'ai arrêté le débogage, relancé et maintenant il est bloqué dans la boucle! Result.IsCompleted. if (this.InvokeRequired) { Résultat IAsyncResult = this.BeginInvoke (nouveau UpdateGrid (DoGridUpdate), nouvel objet [] {items}); while (! Result.IsCompleted) System.Threading.Thread.Sleep (100); this.EndInvoke (résultat); retour; } – Brian

Répondre

1

J'ai oublié cette question mais trouvé une résolution. Je venais d'un arrière-plan ASP.NET et à l'époque je ne savais pas à propos de maintenir le service dans le champ d'application, je suis surpris que cela a fonctionné du tout. La déclaration du service se trouvait dans l'événement button onclick. Je l'ai donc déplacé vers le constructeur de formulaire et rendu le service global pour le formulaire afin que toutes les méthodes y aient accès et que tout fonctionne maintenant comme prévu.

Questions connexes