2016-12-16 2 views
0

J'ai le code ci-dessous:C# méthode n'est pas en cours d'exécution séquentielle

public Dictionary<int, Ticket> GetNewTickets() 
    { 
     Dictionary<int, Ticket> output = new Dictionary<int, Ticket>(); 

     foreach (KeyValuePair<int, Ticket> item in ticketStore) 
     { 
      if (!ticketStoreNew.ContainsKey(item.Key)) 
      { 
       output.Add(item.Key, item.Value); 
      } 
     } 

     ticketStoreNew = ticketStore; 

     return output; 
    }` 

Il faut un dictionnaire, ticketStore, vérifie si elle a des éléments nouveaux ne sont pas en ticketStoreNew et les met dans le dictionnaire de sortie. Ensuite, ticketStoreNew est défini sur ticketStore jusqu'à ce que ticketStore soit mis à jour avec une autre méthode et que cette méthode soit réexécutée.

Toutefois, lorsque j'inclut la ligne ticketStoreNew = ticketStore, le programme renvoie un dictionnaire vide. Il semble que la méthode ne s'exécute pas séquentiellement et qu'elle s'exécute avant la boucle for.

J'ai juste besoin de retourner tout nouvel élément ajouté au dictionnaire ticketStore.

EDIT Voici le code pour obtenir ticketStore:

public void UpdateTickets(string inputXml) 
{ 
    // If no new tickets exit 
    if (inputXml.Trim() == "") { return; } 
    //xmlString = inputXml; 

    // Load XML into an enumerable 
    XElement xelement = XElement.Parse(inputXml); 
    IEnumerable<XElement> xml = xelement.Elements(); 

    foreach (var item in xml) 
    { 
     if (item.Name == "incident") 
     { 
      int id; 

      // If ID can be converted to INT 
      if (Int32.TryParse(item.Element("id").Value, out id)) 
      { 
       // If ticket is not already in store create ticket and populate data 
       if (!ticketStore.ContainsKey(id)) 
       { 
        Ticket ticket = new Ticket(); 
        ticket.id = id; 
        ticket.number = Int32.Parse(item.Element("number").Value); 
        ticket.title = item.Element("name").Value; 
        ticket.description = item.Element("description").Value; 

        ticketStore.Add(id, ticket); 
       } 
      } 
     } 
    } 
} 

}

Les billets sont tous basés sur l'obtention XML de l'API SAManage.

+0

S'il vous plaît inclure la méthode qui met à jour ticketStore car cela serait pertinent ici. –

+0

J'ai modifié le message d'origine pour inclure la méthode de mise à jour. Le magasin de tickets et ses articles de ticket sont tous générés à partir d'un code XML extrait d'un appel d'API. –

+0

mike z: J'ai essayé de remplacer 'ticketStoreNew = ticketStore' avec votre code, mais il fait la même chose. Il renvoie un dictionnaire vide, mais lorsque la ligne est mise en commentaire, elle renvoie certains éléments. –

Répondre

0

Si une autre méthode met à jour ticketStore, l'affectation est le problème. Il ne copie pas le contenu de ticketStore à ticketStoreNew il définit la référence ticketStoreNew pour pointer vers la même instance que ticketStore. Ainsi, ils sont le même objet et ont toujours le même contenu. Essayez de créer un nouveau dictionnaire pour copier les éléments:

ticketStoreNew = new Dictionary<int, Ticket>(ticketStore); 
+0

J'ai essayé de remplacer la ligne 'ticketStoreNew = ticketStore' par votre code, mais cela a le même effet. Il retourne un dictionnaire vide, mais quand la ligne est commentée, j'obtiens quelques résultats. –

+0

@ J.Galus Je ne sais pas comment ticketStoreNew est initialisé, mais commenter cette ligne ne ferait probablement que renvoyer tous les éléments dans ticketStore. Quel genre d'application est-ce? Ces méthodes peuvent-elles s'exécuter sur plusieurs threads? –

+0

ticketStore est une propriété de classe (j'espère utiliser le terme correct). L'application obtient des billets sous la forme de XML à partir d'un site Web, puis affiche une notification s'il y a un nouveau ticket. –

0

Essayez ce code:

private Dictionary<int, Ticket> ticketStoreNew = 
     new Dictionary<int, Ticket>(); // add this line 
    public Dictionary<int, Ticket> GetNewTickets() 
    { 
     Dictionary<int, Ticket> output = new Dictionary<int, Ticket>(); 

     foreach (KeyValuePair<int, Ticket> item in ticketStore) 
     { 
      if (!ticketStoreNew.ContainsKey(item.Key)) 
      { 
       output.Add(item.Key, item.Value); 
       ticketStoreNew.Add(item.Key, item.Value); // add this line 
      } 
     } 

     //ticketStoreNew = ticketStore; remove this line 

     return output; 
    }