Laden...

Event soll nur einmalig Informationen liefern

Erstellt von Pat2381 vor 4 Jahren Letzter Beitrag vor 4 Jahren 928 Views
P
Pat2381 Themenstarter:in
2 Beiträge seit 2019
vor 4 Jahren
Event soll nur einmalig Informationen liefern

Hallo liebe Community,

nach meiner unglücklichen Titelbeschreibung, möchte ich jetzt mal kurz erklären was mir nicht klar ist, oder wo ich Hilfe bräuchte.

Ich habe hier eine Event das feuert, in dieser Methode des aufgerufenen Events, bekomme ich einen Wert!
Dieser Wert ändert sich jetzt ja immer wieder, wenn das Event feuert.

Ich möchte diesen Wert einmal "speichern", ohne das er sich wieder ändert! Ich muss Ihn aber an anderer Stelle im Code wieder auf Null setzten können!



namespace Connector
{

   public partial class ecConnector : Form
   {
     public ecConnector()
     {
        Telemetry = new SdkTelemetry();
        Telemetry.Data += Telemetry_Data;

      }

       private void Telemetry_Data(SCTelemetry data, bool update)
       {
          // Hier bekomme ich jetzt meinen Wert 

                  Variable = data.IRGENDWAS    // Diesen Wert möchte ich jetzt zwischenspeichern, ohne das er sich noch mal ändert

        }
   }
}


Hab ich hier Grundsätzlich was nicht verstanden? Geht das überhaupt so, wie ich das gerne hätte, oder gibt es einen anderen Weg?
Ich hoffe ich konnte mein Anliegen so halbwegs vernünftig erklären!

Ich wünsche euch noch einen schönen Sonntag.

Gruß Pat2381

T
2.219 Beiträge seit 2008
vor 4 Jahren

Du kannst doch im einfachsten Fall prüfen ob deine Variable, in der du den Wert speichern willst, Null ist und übernimmst dann einmalig den Wert.
So kannst du beim erneuten Durchlauf der Event Methode den nächsten Wert ignorieren, bis deine Variable wieder Null ist.
Das zwischen speichern kannst du dann in einer Property o.ä. innerhalb deiner Form Klasse machen.
Das sollte das Problem lösen.

Ansonsten musst du mal etwas mehr Code zeigen, der erklärt was du vorhast.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

301 Beiträge seit 2009
vor 4 Jahren

Ohne genauer zu wissen was dein Vorhaben ist. Du kannst natürlich die Event Abonnierung abschalten sobald du der Wert das erste mal bekommen hast.


 private void Telemetry_Data(SCTelemetry data, bool update)
       {
          // Hier bekomme ich jetzt meinen Wert 

                  Variable = data.IRGENDWAS    // Diesen Wert möchte ich jetzt zwischenspeichern, ohne das er sich noch mal ändert
 Telemetry.Data -= Telemetry_Data;

        }

16.806 Beiträge seit 2008
vor 4 Jahren

Auch ein Anfänger darf sich sehr gerne an die Forenregeln halten. Du bist schließlich auf der Suche nach Hilfe.
[Hinweis] Wie poste ich richtig?
Stell Dir vor, jedes Thema würde hier "Verständnisfrage" heissen. Dass Du eine Frage hast; das ist klar - sonst wärste nicht hier. 👍

Dir ist ja auch selbst bewusst, dass der Titel quatsch ist - wieso machst es nicht gleich richtig?
Jetzt hab ich das für Dich angepasst; das muss ja aber nicht sein. 🙂

KroaX hat aber den richtigen Hinweis gegeben; dass Du prinzipiell den Event einfach nicht mehr abonnierst.
Mit Reactive Extension gibts hierzu auch die Möglichkeit von Einmal-Subscriptions.

Sofern Null kein gültiger Wert ist kann man auch alternativ T-Virus' Vorschlag anwenden.

Edit: SCTelemetry hört sich allgemein nach Messaging an.
Und sowas lässt sich dann sehr gut via IMediatR und/oder Reactive Extensions kombinieren - wäre hier meine grundlegende Empfehlung.
Verwende ich in eigenen Projekten auch in diesem Stil.

P
Pat2381 Themenstarter:in
2 Beiträge seit 2019
vor 4 Jahren

Zu erst einmal viel dank an T-Virus und KroaX für den interessanten Hinweis.

JA Abt du hast zu 100% recht.. ich hätte mir da wirklich einen aussagekräftigeren Titel einfallen lassen müssen. Entschuldigung hier für.

Ich werde noch mal versuchen zu erklären, was ich genau vorhabe.

Im Grunde benötige ich einmal, den festen Wert und aber auch den Wert, der sich durch das Event ändert.
Mit diesen beiden Werten, möchte ich später weiter arbeiten und eine ProgessBar zum laufen bringen.

In data.IRGENDWAS, ist eine Zeitwert in Sekunden (z.b. 6436 sek. ) welcher auf Null runtergeht. Diesen Wert müsste ich dann später noch so Mappen, dass ich Ihn für die ProgressBar verwenden kann.

Ich werde mir nochmal die Vorschläge anschauen und gucken, ob ich da was hinbekomme.

pat2381

16.806 Beiträge seit 2008
vor 4 Jahren

Im Grunde benötige ich einmal, den festen Wert und aber auch den Wert, der sich durch das Event ändert.

Das ist widersprüchlich zum Eingangspost.
Dort sprichst Du nur von einem festen Wert, der sich nicht ändert.

Aber rein wenn man das Requirement mal auf Papier schreiben würde, dann hast Du eben zwei Variablen:
Statischer Wert, dynamischer Wert.

Ergo brauchst Du mindestens mal zwei Variablen, damit Du Deine Progressbar umsetzen kannst.
Das zeigt Dein Code aber nicht.

301 Beiträge seit 2009
vor 4 Jahren

Edit: SCTelemetry hört sich allgemein nach Messaging an.
Und sowas lässt sich dann sehr gut via IMediatR und/oder Reactive Extensions kombinieren - wäre hier meine grundlegende Empfehlung.
Verwende ich in eigenen Projekten auch in diesem Stil.

Kannst du das Szenario wie du das verwendet kombinierst mal ausführen? Würde mich interessieren. Hast du eine Komponente die Reactive Events schmeißt und du hast ne zentrale Stelle in deiner Anwendung welche die Pipeline abfragt und dann über mediations an die richtigen Stellen weiter delegiert oder wie kann man sich das vorstellen?

16.806 Beiträge seit 2008
vor 4 Jahren

Prinzipiell ist das so, dass ich / wir generell vermeiden mit "legacy Events" zu arbeiten, sondern im Prinzip nur noch auf Event Sourcing setzen.
(Wir ist in meinem Fall entweder unsere internen Developer Teams oder Teams, die ich als Externer berate).

Für In-Process Anwendungen ist da das Maß der Dinge einfach im Cross .NET Bereich MediatR.
Damit kann man auch super insgesamt Events in Messages wrappen (Beispiel: https://github.com/BenjaminAbt/Twitch.MediatR)

Das ist soweit der Logik-Part (in der Regel), denn MediatR an für sich hat keinen Store um einen State darzustellen.
Da kommt nun RX.NET ins Spiel, das die Requests/Notifications von MediatR konsumiert und so den State darstellt.

In diesem einfacheren Beispiel wäre es auch denkbar auf MediatR komplett zu verzichten und nur mit RX zu arbeiten.
In komplexeren (Software-)Architekturen ist jedoch meine Erfahrung, dass man mit dem Handler-Prinzip von MediatR für die IO- und Logikkommunikation besser fährt.

PS: ich hab mit Frontend-Anwendungen nicht viel zutun; Berate ja hauptsächlich im Bereich .NET Backend/ASP.NET Core + Co, Azure und AWS.
Dahingehend habe ich ohnehin eher selten Anwendungsfälle für RX.NET, weil eben In-Process State Management, was eher in UI bzw. Desktop-Anwendungen zum Einsatz kommt.

301 Beiträge seit 2009
vor 4 Jahren

Verstehe danke dir für den Einblick.