mayho33
Goto Top

C-Sharp WPF EventHandler Warten und Erfassen

Hi @ All,

Man glaubt es kaum, aber ich habe noch nie mit EventHandler, Delegate usw. gearbeitet. Habs einfach noch nie gebraucht oder elegant umschifft face-wink.
Jetzt stehe ich aber vor dem Problem, dass ich es brauche, aber nicht exakt verstehe was da abgeht und wie ich es umsetze um mein Problem lösen zu können.

Im Detail:

Ein Script arbeitet im Hintergrund ein paar "LongTherm-Operations" ab. Bevor das passiert wird dem Benutzer eine GUI angezeigt in der ein CountDown läuft. Ist der CountDown abgelaufen beginnt das Script zu arbeiten. Außerdem hat der Benutzer die Möglichkeit per Button sofort zu starten. Über die gesamte Laufzeit des Scripts bleibt die GUI offen und bekommt immer wieder per NamedPipe-Communication die aktuellen Schritte des Scripts übermittelt So weit, so gut!


Das Script (NamedPipeClientStream) schickte zu Anfang einige Parameter bzgl. Anzeigetext und wie lange der CountDown läuft. Dann wartet es auf Antwort der GUI.
Nun soll die GUI (NamedPipeServerStream) erst antworten, wenn entweder der Countdown abgelaufen ist oder der Benutzer auf den Button drückt.

Mein Problem:

Das Script weiß nicht ob und wann der User den Button geklickt hat! Im Code-Behind hat jeder Button ja ein RoutedEventArgs. Das wird aber nur innerhalb der Methode erfasst (oder nicht?).
BSP:
private void btn_Install_Click(object sender, RoutedEventArgs e)
{
}

Dieses "Event" würde ich gerne abgreifen und dann einen Task beenden damit die NamedPipe weiter arbeitet. oder einen weiteren EventHandler erstellen ala (exemplarisch!!):
public event EventHandler<EventArgs> ButtonClicked;
private static CancellationTokenSource ButtonClicked_CT_ = new CancellationTokenSource();

private void btn_Install_Click(object sender, RoutedEventArgs e)
{
    //...auslösen des Events
}


//Lösung A )
public static void StartServerAsync()
{
    ConnectServer();
    streamR_Server = new StreamReader(conServer);
    streamW_Server = new StreamWriter(conServer);

    Task.Factory.StartNew(() =>
    {
        conServer.WaitForConnection();
    	streamW_Server.WriteLine(AUTHENTICATION);
        streamW_Server.Flush();
        conServer.WaitForPipeDrain();

	string received = string.Empty;
        do
        {
            try
            {
                received = streamR_Server.ReadLine();
                        
	        **// HIER AUF BUTTON CLICK EVENT WARTEN !!!!**
                        
                streamW_Server.WriteLine(">>" + received);  
                streamW_Server.Flush();
                conServer.WaitForPipeDrain();
            }

	    catch (Exception ex) { }

        } while (conServer.IsConnected);
    });
}


// Lösung B )
private async void WaitForButtonClick()
{
    await Task.Factory.StartNew(()=>
    {
        while( !ButtonClicked_CT_.IsCancellationRequested)
        {
            **// HIER AUF BUTTON CLICK EVENT WARTEN  !!!!**
            if(ButtonClicked) {  ButtonClicked_CT_.Cancel;}
            Thread.Sleep(200);
        }
    });
}

Hat dazu jemand ein ganz simples Beispiel eines EventHandlers?

Vielen Dank für die Unterstützung!

Mayho

Content-ID: 623456

Url: https://administrator.de/contentid/623456

Ausgedruckt am: 23.11.2024 um 04:11 Uhr

8Layer
8Layer 20.11.2020 um 01:33:55 Uhr
Goto Top
Guten Morgen

First things first: Ich bin selber nur Hobbymäßig Entwickler, daher kann ich leider nicht sagen ob mein Ansatz best practice ist.

Delegate sind hier glaube ich nicht der richtige Ansatz. Beim erklären für was sie sind und wie tue ich mich schwer, aber ich denke das ist hier ganz gut Beschreiben.

Das event abgreifen ist glaube ich auch nicht der richtige Ansatz, eher es zu verwenden. Ein Objekt kann Events bereitstellen, für die sich andere Objekte wieder registrieren können. Löst das Objekt nur das Event aus, werden die dafür registrieren Objekte notifiziert und können daraufhin etwas unternehmen. Gerne kann ich hierzu mal ein kleines Beispiel bereitstellen, falls gewünscht.

Zu deiner eigentlichen Frage: Ein bool als Parameter vom Typ ref könnte funktionieren. Der Button press ändert dann nur den Zustand / Wert der Variable.
mayho33
mayho33 20.11.2020 um 10:31:06 Uhr
Goto Top
Zitat von @8Layer:

Guten Morgen

Mahlzeit! face-wink

First things first: Ich bin selber nur Hobbymäßig Entwickler, daher kann ich leider nicht sagen ob mein Ansatz best practice ist.


Eigentlich bin ich kein Hobby-Entwickler. Der Schwerpunkt liegt bei mir aber auf Installationsautomatisierung mit PS, VBS und wenn es denn unbedingt sein muss auch Batch. In C# hauptsächlich kleiner Helper und CmdLets. Zu ersten Mal aber eine GUI die mit einem CmdLet zusammenarbeiten muss. Was das Know-How angeht bin ich im letzten Punkt aber genau da, beim Hobby-Entwickler.

Delegate sind hier glaube ich nicht der richtige Ansatz. Beim erklären für was sie sind und wie tue ich mich schwer, aber ich denke das ist hier ganz gut Beschreiben.

Danke für den Link!

Das event abgreifen ist glaube ich auch nicht der richtige Ansatz, eher es zu verwenden.

Eigentlich will ich nur fesststellen, wann geklickt wurde. Und das aus einer anderen Methode in einer anderen Klasse. Also eher abgreifen oder erwarten nach meinem Verständnis.

Zu deiner eigentlichen Frage: Ein bool als Parameter vom Typ ref könnte funktionieren. Der Button press ändert dann nur den Zustand / Wert der Variable.

Ich bin mittlerweile wieder bei einem Async/Await Task gelandet. Funktioniert! Aber was mich daran stört ist eben, dass es ja auch Events gibt. Die könnte man doch global definieren... und einfach erwarten. Aber naja!

Grüße!

Mayho
8Layer
8Layer 20.11.2020 um 11:44:56 Uhr
Goto Top
Hi,

sorry für das Kommentar mit dem Hobby Entwickler! Ich meinte nicht das du einer bist / es mir so vorkommt sonder um mein Kenntnisstand wiederzuspiegeln. Sollte ich dir mit der Aussage zu nahe getreten sein, entschuldige dies bitte. Vielleicht sollte man nicht so spät Texte / Antworten formulieren^^

Wenn ich die Zeit am Wochenende finde, würde ich dir ein kleines Beispiel geben wie ich Events immer verwendet habe, ggf. Hilft das.
mayho33
mayho33 20.11.2020 aktualisiert um 12:03:37 Uhr
Goto Top
Zitat von @8Layer:

Hi,

sorry für das Kommentar mit dem Hobby Entwickler! Ich meinte nicht das du einer bist / es mir so vorkommt sonder um mein Kenntnisstand wiederzuspiegeln. Sollte ich dir mit der Aussage zu nahe getreten sein, entschuldige dies bitte. Vielleicht sollte man nicht so spät Texte / Antworten formulieren^^

Alles gut! Habe es nicht wertend gesehen. Wollte auch nur mein Level widerspielgeln.

Wenn ich die Zeit am Wochenende finde, würde ich dir ein kleines Beispiel geben wie ich Events immer verwendet habe, ggf. Hilft das.

Du musst dich nicht extra wegen mir hinsetzen. Außer es macht dir eh Spaß! Dann wäre ich dankbar für ein brauchbares Beispiel. Im Link steht übrigends:

Delegate kann dafür verwendet werden dem User in der GUI mitzuteilen ob eine Operation abgeschlossen ist....

Das kommt ja schon gut in die Richtung die ich haben will.. face-smile