2011-06-10 2 views
1

J'ai une application Windows Forms sur laquelle je travaille, mais j'ai des problèmes lorsque je lance l'application. L'application doit charger les informations enregistrées à partir d'un fichier de configuration, puis vérifier les nouveaux éléments. Lorsque je lance l'application, elle commence à rechercher de nouveaux éléments avant de charger les éléments enregistrés. Pour cette raison, l'utilisateur est alerté des nouveaux éléments qui ne sont pas vraiment nouveaux, ils n'ont tout simplement pas encore été chargés à partir du fichier.Problème de contrôle du flux d'une application

Le formulaire:

public class MainForm : Form 
{ 
    A a; 

    public MainForm() 
    { 
     InitializeComponent(); 
     a = new A(); 
     a.ItemsFound += new A.NewItemsFoundEventHandler(a_FoundItems); 
     a.ItemsLoaded += new A.ItemsLoadedEventHandler(a_ItemsLoaded); 
     a.LoadItems(); 
    } 

    public void a_FoundItems(object sender, EventArgs e) 
    { 
     //Alert user of new items. 
    } 
    public void a_ItemsLoaded(object sender, EventArgs e) 
    { 
     //Update GUI with items loaded from file. 
     this.UpdateTheGUI_ThisIsNotARealMethodInMyProgram(); 

     //Then look for new items. 
     a.CheckForUpdates(); 
    } 
} 

L'autre objet:

public class A 
{ 
    public A(){} 

    public void LoadItems() 
    { 
     //Load Items from save file... 
     OnItemsLoaded(this); 
    } 

    public void CheckForUpdates() 
    { 
     //Check for new items... 
     //If new items are found, raise ItemsFound event 
     OnNewItemsFound(this,new EventArgs()); 
    } 

    public delegate void NewItemsFoundEventHandler(object sender, EventArgs e); 
    public event NewItemsFoundEventHandler ItemsFound; 
    protected void OnNewItemsFound(object sender, EventArgs e) 
    { 
     if(ItemsFound != null) 
     { 
      ItemsFound(sender,e); 
     } 
    } 

    public delegate void ItemsLoadedEventHandler(object sender, EventArgs e); 
    public event ItemsLoadedEventHandler ItemsLoaded; 
    protected void OnItemsLoaded(object sender) 
    { 
     if(ItemsLoaded != null) 
     { 
      ItemsLoaded(sender,new System.EventArgs()); 
     } 
    } 
} 

Dois-je avoir objet un appel, il est fonctionne sur un nouveau thread, et verrouiller si CheckForUpdates ne peut pas être appelé si LoadItems est en cours d'exécution, ou y a-t-il une manière plus simple de faire ceci que je manque?

EDIT:

Je trouve le problème. Je nettoyais la liste des objets (donc ça ne se développerait pas pour toujours), mais je ne faisais que le remplir avec les objets nouvellement trouvés. Donc, chaque fois que j'ai lancé l'application, seuls les éléments les plus récents dans la liste, et tous les anciens éléments ont été vidés.

STUPIDE !!!

Merci pour l'aide si, et désolé pour la question de merde.

+1

Désactiver l'entrée d'application pendant que le traitement de chargement est en cours? – kenny

Répondre

2

Y a-t-il une raison pour laquelle la vérification n'est pas dans le constructeur?

public MainForm() 
{ 
    InitializeComponent(); 
    a = new A(); 
    a.ItemsFound += new A.NewItemsFoundEventHandler(a_FoundItems); 
    a.ItemsLoaded += new A.ItemsLoadedEventHandler(a_ItemsLoaded); 
    a.LoadItems(); 
    a.CheckForUpdates(); 
} 
+0

Je l'avais comme ça à l'origine, mais il agissait de la même manière, donc je l'ai déplacé vers la méthode a_ItemsLoaded pour essayer de résoudre le problème. – Tester101

+0

Ajouter des points d'arrêt à 'CheckForUpdates()', 'a_FoundItems (...)' et 'a_ItemsLoaded (...)'. Vérifiez la pile d'appels lorsque vous atteignez ces points d'arrêt. – mgronber

+0

La mise en place de points d'arrêt m'a aidé à réaliser ma stupidité. Merci pour l'aide. – Tester101

2

Hmm, à partir du code que vous avez posté je ne vois pas un problème, surtout en supposant que tout cela fonctionne sur le fil ui .. peut vous envoyer le code pour le chargement des articles?

Peut-être que le chargement lui-même déclenche l'événement ItemsFound? Vous pouvez faire l'abonnement pour ItemsFound dans le gestionnaire d'événements pour ItemsLoaded au lieu de dans le constructeur.

public class MainForm : Form 
{ 
    A a; 
    public MainForm() 
    { 
     InitializeComponent(); 
     a = new A(); 
     a.ItemsLoaded += new A.ItemsLoadedEventHandler(a_ItemsLoaded); 
     a.LoadItems(); 
    } 

    public void a_ItemsLoaded(object sender, EventArgs e) 
    { 
     a.ItemsFound += new A.NewItemsFoundEventHandler(a_FoundItems); 
     a.CheckForUpdates(); 
    } 
}