Frage

Sagen wir, ich habe 2 Methoden. Eines ist ein Verfahren, mit dem ausgewählten Index ausgelöst im Listenfeld zu ändern. Die zweite Methode hilft, indem Sie alle Textfelder löschen, Einstellung listbox Index auf -1, und der Fokuseinstellung.

Frage:

Methode zwei ausgeführt wird, während der Code den ausgewählten Index der List-Box auf -1 ändert, wodurch die Ereignisauslöser für die 1. Verfahren Einstellung ab. Does Methode 2 HALT ist es eigene Ausführung und überträgt den Prozess auf das Ereignis, und dann wieder in seiner Arbeit nach dem Verfahren wieder zurück 1 beendet ist ... oder hat zwei Verfahren Finish sein gesamte Codeblock dann übertragen zu Methode 1, da die ausgewählten Indexänderungen

War es hilfreich?

Lösung

Der erste Fall ist.

Lassen Sie uns Fäden lassen aus ihm für einen Moment, vor allem, weil sie in Ihrem Szenario nicht beteiligt sind.

Sie sprechen über Eigenschaften und Methoden, aber unter all dem, es ist alles nur Funktionen. Wenn eine Funktion aufruft, eine andere, die Kontrolle in Ihrem Programm überträgt an die aufgerufene Funktion. Wenn diese Funktion Ausführung beendet ist, die Kontrolle Rückgabe zu dem Punkt, wo es hieß. Ihr Programm automatisch merkt sich, wo es braucht, um zurück zu gehen, egal wie tief Funktionen aufrufen mehr functions.*

Wenn Ihre zweite Funktion des Index setzt, was wirklich passiert ist, dass der Compiler die Eigenschaft festgelegten Betrieb in einen Funktionsaufruf übersetzt. (Eigenschaften sind letztlich nur „syntaktischer Zucker“ für Funktionen.) Diese Funktion eine Reihe von anderen Funktionen aufruft, die nicht wichtig für das Szenario sind, mit der Ausnahme, dass einer von ihnen ist derjenige, der „Index geändert“ Event-Handler aufruft. Es sieht, dass Sie eine Methode, mit diesem Ereignis verbunden sind, und es ruft die erste Methode.

Ihre erste Methode ausgeführt wird, und wenn es fertig ist, kehrt er in die Funktion „den Index-verändert-Ereignishandler aufrufen“. Schließlich, das und alle anderen unwichtigen Funktionen beenden laufen (vielleicht nach mehr Funktionsaufrufe in Folge machen), und die „den Index-Eigenschaft“ Funktion kehrt in Ihre zweite Methode steuern.

Sie können sich selbst beweisen, dass Ihr erster Vorschlag ist, wie es funktioniert. Zeigen Sie ein Meldungsfeld in Ihrem ersten Verfahren, und zeigt ein anderes Meldungsfeld nach dem Punkt in Ihrem zweiten Verfahren, in dem Sie die Index-Eigenschaft festgelegt. (Verwenden Sie verschiedene Nachrichten!) Sie sollten die erste Meldung angezeigt wird, und nachdem Sie das Meldungsfeld schließen, sollten Sie die zweite Meldung angezeigt wird, was zeigt, dass das zweite Verfahren die Ausführung nicht fortsetzen, während der erste Lauf wurde.

* Es ist eine Grenze, aber es ist selten getroffen, es sei denn es ist ein Fehler in Ihrem Programm. Wenn Sie zu viele verschachtelte Funktionsaufrufe haben, was passiert ist, ein Stack-Überlauf .

Andere Tipps

Es gibt eine dritte Alternative, die Sie erkunden können: sie können auch laufen zur gleichen Zeit ! Wenn ich Ihre Frage richtig verstanden hat, Methode 2 würde durch das Indexänderungsereignis ausgelöst werden. In einer C # Windows Forms-Anwendung, das andere Ereignis würde in einem separaten Thread der Ausführung auftreten.

Konzepte zu erforschen. Threading

Ich hoffe, das Ihnen einen Ausgangspunkt in Ihren Erkundungen des Wissens gibt.

keine Multi-Thread-Situation Unter der Annahme, wird das Ereignis ausgelöst, bevor er die Durchführung des Verfahrens beenden. Wenn Sie diese sehen möchten, Code, was Sie haben in einer .NET-Sprache vorgeschlagen und untersucht das Il hergestellt. Sie können dies tun, mit ILDASM oder Reflektor, oder sogar Ihre eigenen relfletion Anwendung erstellen. Sie haben die Syntax von IL zu verstehen, genug, um den Zweig zu sehen, aber es ist nicht so schwierig, solange Sie Programmierkonzepte zu verstehen.

Rob hat diesen „syntaktischen Zucker“ bezeichnet, die mich mit etwas zustimmen. Es ist wirklich ein Compiler Trick, aber ich denke, es ist unter der Bezeichnung „syntaktischen Zucker“ fällt, wie es allgemein verwendet wird.

Ich nehme an, die betreffende Sprache C # ist und Sie somit eine Sprache, die mehrere Threads unterstützt. Wenn Sie nicht wollen, über Themen kümmern (was eine schlechte Idee wäre, wenn Sie Benutzererfahrung betrachten) können Sie Ihre GUI in einem Thread laufen und das gleiche Verhalten haben, es sei denn, die Komponenten ihren eigenen Thread erzeugen (was ein bisschen wäre seltsam though). Wenn Sie eine asynchrone (parallel) Durchführung der Veranstaltung erreichen wollen müssen Sie die das Ereignis haben, in einem eigenen Thread ausgelöst wird.

Um Ihre Frage zu beantworten: Wenn Sie nicht mehr Threads verwendet werden, wobei das Verfahren durch das Ereignis ausgelöst wird die Warteschlange gestellt werden. Dies ist genau das, was passiert, wenn Sie GUI sehen reagiert langsam in einigen Programmen.

Hoffe, dass es Dinge ausgeräumt und begrüßt von einem anderen Neuling:)

Ich selbst bin ein Anfänger, vielleicht kann ich helfen. Method2 würde schießen, dann, wenn sich die Auswahl ändert, Method1 seine Sachen tun würde, dann würde Method2 weiter.

Wenn Sie nicht Method1 wollen zu diesem Zeitpunkt feuern, möchten Sie vielleicht tun, so etwas wie: (Wirklich Pseudo-Code)

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;
}

Es ist wahrscheinlich nicht optimal (und vielleicht noch einig Best Practices ...), aber für einen Mangel an einer besseren Erklärung, zumindest haben Sie ein wenig Informationen, die Sie suchen, um zu helfen. Hoffe, es hilft!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top