2009-02-20 10 views
3

Dites que j'ai 2 méthodes. L'une est une méthode déclenchée par le changement d'index sélectionné dans la liste. La deuxième méthode permet d'effacer toutes les zones de texte, de définir l'index de la liste à -1 et de définir le focus.Ordre de priorité avec des méthodes?

Question:

Méthode deux exécute, au cours de ce code, il modifie l'index sélectionnée de la zone de liste à -1, fixant ainsi sur la détente de l'événement pour la première méthode. Est-ce que la Méthode 2 HALTE est sa propre exécution et transfère le processus à l'événement, puis retourne à son travail après que la Méthode 1 soit terminée ... OU la méthode 2 termine-t-elle son codeblock entier?

+0

Bienvenue - comme dans la FAQ pour les devoirs - "Essayez de résoudre le problème de bonne foi en premier." Alors lancez-vous, puis demandez à la communauté de critiquer votre réponse. Vous apprendrez beaucoup plus et vous obtiendrez plus de réponses. – nzpcmad

+0

ce n'est pas un devoir. Je suis actuellement un étudiant essayant d'élargir mes connaissances, les recherches que j'ai faites étaient au-delà de mes connaissances techniques en ce moment :-(Ceci a fourni une bonne réponse solide Merci à tout le monde – SheldonH

+0

Au lieu de simplement chercher, vous auriez dû expérimenter. Idle googler peut difficilement être qualifié d'une tentative de bonne foi pour résoudre le problème vous-même, est-il? – bzlm

Répondre

8

Le premier cas. Laissons les threads en dehors de cela pendant un moment, en particulier parce qu'ils ne sont pas impliqués dans votre scénario.

Vous parlez de propriétés et de méthodes, mais au-dessous de tout cela, tout n'est que fonction. Lorsqu'une fonction en appelle une autre, contrôlez dans votre programme les transferts à la fonction appelée. Lorsque cette fonction est terminée, le contrôle renvoie au point où il a été appelé. Votre programme se souvient automatiquement de l'endroit où il doit revenir, peu importe à quel point les fonctions appellent plus de fonctions.Lorsque votre deuxième fonction définit l'index, ce qui se passe réellement, c'est que le compilateur traduit l'opération d'ensemble de propriétés en un appel de fonction. (Les propriétés ne sont finalement que du "sucre syntaxique" pour les fonctions.) Cette fonction appelle un tas d'autres fonctions qui ne sont pas importantes pour le scénario, sauf que l'une d'entre elles est celle qui appelle le gestionnaire d'événements "index changed". Il voit que vous avez une méthode associée à cet événement, et il appelle votre première méthode.

Votre première méthode fonctionne, et quand il se termine, il retourne à la fonction « appeler le gestionnaire d'événements changé d'index ». Finalement, cela et toutes les autres fonctions sans importance finissent de s'exécuter (peut-être après avoir fait plus d'appels de fonction en séquence), et la fonction "set the index property" renvoie le contrôle à votre seconde méthode.

Vous pouvez vous prouver que votre première suggestion est de savoir comment cela fonctionne. Afficher une boîte de message dans votre première méthode et afficher une autre boîte de message après le point dans votre deuxième méthode où vous définissez la propriété d'index. (Utilisez des messages différents!) Vous devriez voir le premier message apparaître, et après avoir fermé la boîte de message, vous devriez voir le deuxième message apparaître, montrant ainsi que la seconde méthode n'a pas continué à s'exécuter pendant que la première était en cours d'exécution.

* Il est une limite, mais il est rarement touché à moins qu'il ya un bug dans votre programme. Lorsque vous avez trop d'appels de fonction imbriqués, ce qui se passe est un débordement de pile.

+0

très perspicace, merci pour l'aide! – SheldonH

0

Je suppose que le langage en question est C# et vous avez donc un langage qui supporte plusieurs threads. Si vous ne voulez pas vous soucier des threads (ce qui serait une mauvaise idée si vous considérez l'expérience utilisateur), vous pouvez exécuter votre interface graphique dans un thread et avoir le même comportement, sauf si les composants créent leur propre thread (ce qui serait un peu étrange cependant). Si vous souhaitez réaliser une exécution asynchrone (parallèle) de l'événement, vous devez déclencher l'événement dans son propre thread.

Pour répondre à votre question: si vous n'utilisez pas plusieurs threads, la méthode déclenchée par l'événement sera mise en file d'attente. C'est exactement ce qui se passe lorsque vous voyez l'interface graphique répondre lentement dans certains programmes.

L'espoir a effacé les choses et bienvenue d'un autre nouveau venu :)

+0

Sa question est étiqueté comme C# bien. – Amy

+0

j'ai changé ma réponse en conséquence, merci de me faire prendre conscience de cette erreur de mes évidente. –

+0

Grande réponse. .. donc la méthode se termine, puis ONCE finit le transfert à la méthode suivante, mettant ainsi "en file d'attente" l'évènement déclenché, à moins qu'il n'ait été délibérément APPELÉ plus tôt, ce qui m'a vraiment aidé. pour l'accueil – SheldonH

1

Il y a une troisième alternative, vous pouvez explorer: ils peuvent également exécuter en même temps! Si je comprends bien votre question, la méthode 2 serait déclenchée par l'événement de changement d'index. Dans une application C# Windows Forms, cet autre événement se produirait dans un thread d'exécution distinct.

Concepts à explorer: filetage. J'espère que cela vous donnera un point de départ dans vos explorations de la connaissance.

0

Je suis moi-même débutant, peut-être que je peux vous aider. Method2 se déclencherait, puis lorsque la sélection changerait, Method1 ferait son travail, puis Method2 continuerait.

Si vous ne voulez pas Method1 au feu à ce moment-là, vous voudrez peut-être faire est quelque chose comme: (code vraiment pseudo)

Method2(object sender, System.EventArgs e) 
{ 
    //Unsubscribe Method1 from ListboxEvent 
    Listbox.OnSelectionChange -= Method1; 

    ... Stuff Method2 actually does ... 

    Manualy call Method1 if you want it to fire 

    //Subscribe Method1 from ListboxEvent 
    Listbox.OnSelectionChange += Method1; 
} 

Il est probablement pas optimale (et peut-être des meilleures pratiques. ..) mais pour un manque d'une meilleure explication, au moins vous avez un peu d'information pour vous aider à chercher. J'espère que cela aide!

1

En supposant qu'aucune situation multithread, l'événement se déclenchera avant la fin de l'exécution de la méthode. Si vous voulez voir ceci, codez ce que vous avez suggéré dans un langage .NET et examinez le Il produit. Vous pouvez le faire avec ILDASM, ou Reflector, ou même créer votre propre application de relfletion. Vous devez comprendre la syntaxe de IL assez pour voir la branche, mais ce n'est pas si difficile, tant que vous comprenez les concepts de programmation. Rob a étiqueté ce "sucre syntaxique", ce que je suis d'accord avec quelque peu. C'est vraiment une astuce de compilateur, mais je suppose que cela relève de l'étiquette "sucre syntaxique" car il est couramment utilisé.

Questions connexes