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 .
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:
Dieses "Event" würde ich gerne abgreifen und dann einen Task beenden damit die NamedPipe weiter arbeitet. oder einen weiteren EventHandler erstellen ala (exemplarisch!!):
Hat dazu jemand ein ganz simples Beispiel eines EventHandlers?
Vielen Dank für die Unterstützung!
Mayho
Man glaubt es kaum, aber ich habe noch nie mit EventHandler, Delegate usw. gearbeitet. Habs einfach noch nie gebraucht oder elegant umschifft .
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
Please also mark the comments that contributed to the solution of the article
Content-ID: 623456
Url: https://administrator.de/contentid/623456
Printed on: October 11, 2024 at 02:10 o'clock
4 Comments
Latest comment
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.
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.
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.
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.