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.
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%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.
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%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.