Frage

Ich arbeite an einer WinForms-Anwendung, und ich habe ein Benutzersteuer drin. Die Schaltflächen in der Benutzersteuerung erhöhen Ereignisse bis zur Form von anderem Code behandelt werden. Eine der Tasten beginnt einige processses, die Probleme verursachen, wenn sie gleichzeitig ausgeführt werden. Ich habe Logik im Code den Zustand zu verwalten, so normalerweise ein Benutzer den Prozess nicht ausgeführt werden kann, wenn es bereits ausgeführt wird. Wenn jedoch der Benutzer auf die Schaltfläche doppelklickt wird es den Prozess zweimal so schnell zu starten, dass es hart für mich, es zu verhindern.

Ich frage mich, was ist der beste Weg, dies zu umgehen?

begann ich durch Deaktivieren der Schaltfläche in dem Click-Ereignis, aber der zweite Klick kommt, bevor der erste Klick bewirkt, dass die Taste deaktiviert sein. Festlegen andere Flags in dem Code hat es auch nicht fangen.

Ich betrachte auf dem Code eine Art Synchronisierverriegelung hinzufügen, die das Ereignis auslöst, aber ich frage mich, ob jemand von euch eine bessere Idee.

Da dieses Projekt weitgehend abgeschlossen ist, ich bin der Suche nach Antworten, die keine radikale Neufassung der App beinhalten (die Composite Application Block wie Implementierung), aber fühlen Sie sich frei, diese Ideen auch zu schreiben, da ich in können sie meine nächsten Projekte.

War es hilfreich?

Lösung

Stellen Sie sicher, dass Ihre Schaltfläche Sperr- oder andere Sperr, die Sie tun, ist die / erste / Sache, die Sie in Ihren Event-Handler zu tun. Ich wäre sehr überrascht, wenn Sie vor sogar dem ersten Befehl ausgelöst zwei Klickereignisse anstehen könnten, aber ich denke, das ist möglich, wenn Sie auf einen sehr langsamen Computern sind, die unten mit anderen Anwendungen festgefahren sind.

In diesem Fall einen Flag verwenden.

private bool runningExclusiveProcess = false;

public void onClickHandler(object sender, EventArgs e)
{
    if (!runningExclusiveProcess)
    {
        runningExclusiveProcess = true;
        myButton.Enabled = false;

        // Do super secret stuff here

        // If your task is synchronous, then undo your flag here:
        runningExclusiveProcess = false;
        myButton.Enabled = true;
    }
}

// Otherwise, if your task is asynchronous with a callback, then undo your flag here:
public void taskCompletedCallback()
{
    runningExclusiveProcess = false;
    myButton.Enabled = true;
}

Wenn Sie immer noch in zwei Klicks weg von so etwas bekommen können, dann stellen Sie sicher, dass Sie nicht versehentlich abonniert einem doubleclick -Ereignis, oder irgendetwas anderes wackelig vor sich geht.

Andere Tipps

gehen Sie mit der Veranstaltung zweimal?

Ich bin sehr überrascht zu lesen, dass der zweite Klick in kommt, bevor Sie die Taste deaktivieren. Ich würde schauen, um sicherzustellen, dass Sie nicht das Ereignis zweimal Einhaken. Ich habe dies vor zufällig geschehen. Sie werden dann zwei Events, fast augenblicklich.

Die Sperrflagge auf diese Schaltfläche nicht, bis die Schaltfläche Ereignishandler abgeschlossen ist und alle zusätzlichen Klicks in der Windows-Nachrichtenwarteschlange hinter dem ersten Klick wird die Warteschlange gesetzt werden würde. Stellen Sie sicher, dass die Schaltfläche Ereignishandler beendet schnell den UI-Thread freizugeben. Es gibt mehrere Möglichkeiten, dies zu tun, aber alle beinhalten eather einen Thread Laichen oder einen Worker-Thread bereit zu halten und warten auf eine Autoreset.

Durch eine Chance, beschriften Sie die Schaltfläche mit einem Symbol? Mit allen Mitteln verwenden, um Code zwei Prozesse auf einmal zu verhindern laufen, aber Sie können auf der menschlichen Seite, wenn Ihre Schaltfläche aussieht und wirkt wie eine herkömmliche Befehlsschaltfläche (rechteckig, Textbeschriftung nur „angehoben“ Oberfläche, die auf einem Doppelklick reduzieren drücken klicken). Nur ein Gedanke.

Deaktivieren Sie die Taste los, sobald es angeklickt wird. So kann das Ereignis nicht zweimal behandelt werden. Sobald das Ereignis behandelt worden ist, können Sie die Taste erneut aktivieren.

Die geprüfte Antwort liegt in der Nähe, wenn anekdotische am besten. Zum uninitated es fehlt zu viel Code Sinn zu machen. Ich habe einen Artikel über die Verwendung von Timer geschrieben und Threads und das Codebeispiel ist wirklich leicht zu verstehen. Versuchen Sie, durch sie zu lesen und zu sehen, wenn Sie die Flags aus dem obigen Beispiel setzen können in einem neuen Thread Ihre Aufgabe Prozess ausgeführt wird:

http://www.robault.com/category/Threading.aspx

Deaktivieren Sie die Taste, nachdem der Benutzer es zuerst klickt und vor der Aufgabe zu starten. Wenn die Aufgabe abgeschlossen ist, aktivieren Sie die Taste.

  

Ich begann mit der Taste deaktivieren   in dem Click-Ereignis, aber die zweite   Klick kommt in vor dem ersten Klick   bewirkt, dass die Taste deaktiviert sein.   Festlegen andere Flags in dem Code hat nicht   fangen sie auch nicht.

Da WinForms ist von Natur aus Single-Threaded, ist es nicht möglich sein sollte, der zweite Klick vor der Verarbeitung für den ersten Brand abgeschlossen (es sei denn, Sie neue Themen oder BackgroundWorkers verwenden usw.).

Können Sie uns zeigen ein Beispiel veranschaulicht das Problem?

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