Abbrechen einer Schleife mit einem Klick - C #

8

Ich habe eine Frage bezüglich Schleifen mit Button Click Event, ich habe viele Methoden ausprobiert & amp; Ich habe viele Seiten auf der Suche nach einer einfachen Antwort für die letzte Stunde durchsucht, aber die Wahrheit ist, dass jede Antwort einfach wie ein Alien-Code aussieht, wahrscheinlich weil ich noch sehr neu in der Entwicklung bin.

Hier ist eine vereinfachte Version von dem, was ich versuche zu tun:

%Vor%

Offensichtlich ist dies nicht meine API, oder es wäre eine nutzlose Sache zu erfinden, aber der Code selbst ist lang & amp; ihr fragt immer nach "relevant code" (keine respektlosigkeit), also da ist es.

Mein Problem: Nach dem Klicken auf Button 2 bricht die Spam-Schleife ab. Der Code für mich sieht gut aus, dass die API es herausfinden kann, aber jedes Mal, wenn auf die Schaltfläche 1 geklickt wird, bleibt die API hängen.

    
Hellooo123 20.12.2014, 12:28
quelle

4 Antworten

9

Verwenden Sie einen Hintergrundarbeiter, um Ihre Arbeit zu erledigen. Sie können die Abbruchfunktion verwenden, um nach Abschluss des Vorgangs zu brechen. Ihre Schleife, so wie Sie sie haben, blockiert den UI-Thread bei einer synchronen Ausführung, weshalb Ihre GUI nicht mehr reagiert. Hinweis: Wenn Sie eine Interaktion mit der Benutzerschnittstelle im Do Work-Delegaten durchführen, müssen Sie auf den UI-Thread zurückmarschieren (z. B. über Invoke).

%Vor%     
steve16351 20.12.2014, 12:39
quelle
6

Es gibt eine wichtige Sache zu erinnern:

Während der Code ausgeführt wird, kann der Benutzer nicht mit Ihrer Benutzeroberfläche interagieren.

Das bedeutet: Sie müssen die Schleife zuerst beenden (d. h. von der Spam -Methode zurückkehren), und dann kann der Benutzer auf Button2 klicken.

Das ist eine harte Wahrheit, denn das bedeutet, dass Sie den Code nicht so schreiben können, wie Sie es wollten. Glücklicherweise gibt es ein paar Möglichkeiten, um das zu umgehen:

  • Verwenden Sie keine Schleife. Verwenden Sie eine Art Timer , um das "Spamming" auszuführen. Button1 startet den Timer, Button2 stoppt ihn. Welche Art von Timer verfügbar ist, hängt von der Benutzerschnittstellenbibliothek ab, die Sie verwenden (WinForms hat Timer , WPF hat DispatcherTimer ).

  • Machen Sie das "Spamming" in einem Hintergrund-Thread . Dadurch kann Ihre Benutzeroberfläche reaktionsschnell bleiben und Sie können mit dem Hintergrundthread kommunizieren, indem Sie beispielsweise volatile Boolean festlegen. Dies ist jedoch ein fortgeschrittenes Thema (und kann schnell zu komplexen Synchronisierungsproblemen führen). Daher schlage ich vor, dass Sie zuerst die andere Option ausprobieren.

Heinzi 20.12.2014 12:36
quelle
0

Wenn Sie auf button1 klicken, wird die Spam-Methode aufgerufen und die Schleife wird gestartet. Wenn Sie auf button2 klicken, wird Spam-Methode aufgerufen, aber es ist nicht das Gleiche. Es ist die zweite Ausführung, also wird es die Bedingung prüfen und wird nicht in die Schleife eintreten, aber die Schleife in der ersten Anrufleiste wird ausgeführt.

Sie sollten ein Flag verwenden, und die Schleife sollte dieses Flag verwenden, um festzustellen, ob es noch ausgeführt werden soll. Es sollte ungefähr so ​​aussehen:

%Vor%     
Landeeyo 20.12.2014 12:37
quelle
0

Sehen Sie sich dieses Konzept an:

%Vor%

Der Benutzer kann jedoch keine Taste drücken, wenn eine MessageBox weiterhin angezeigt wird, da sie den Hauptthread der Benutzeroberfläche einnimmt. Um dies zu verhindern, können Sie BackgroundWorker verwenden oder einen neuen Thread starten.

    
Eric 20.12.2014 12:35
quelle

Tags und Links