Laden...

Warum wird ein OnValueChange listener erst am Ende des Codes ausgeführt?

Erstellt von Maxteric vor 3 Jahren Letzter Beitrag vor 3 Jahren 498 Views
M
Maxteric Themenstarter:in
3 Beiträge seit 2020
vor 3 Jahren
Warum wird ein OnValueChange listener erst am Ende des Codes ausgeführt?

Hallo zusammen!

Ich versuche derzeit über Firebase einen Snapshot einer Datenbank in eine variable in meiner Software zu laden. Da ich hierzu einen Listener (OnValueChange) im Quellcode aufrufe, stehe ich vor dem Problem, dass dieser erst ausgeführt wird sobald der restliche Quellcode ausgeführt wurde.

Beispiel:


static void Main()
{
   Debug.WriteLine("Line 1");
   LoadDataSnapshot(); // Hier wird der listener an die firebase datenbank gehangen und sollte auch direkt ausgeführt werden. (Bsp. FirebaseDatabase.GetReference(REFERENCE).OnValueListener(CLASS)
   Debug.WriteLine("Line 2");
}

Das Problem vor dem ich stehe ist folgendes:
Wenn ich den listener an die Datenbank anhänge, möchte ich danach direkt Werte aus diesem Snapshot auslesen. Leider wird erst der gesamte Quellcode ausgeführt und erst (siehe Beispiel) nach Debug.WriteLine("Line 2"), sozusagen am Ende des Quellcodes wird der Listener ausgeführt.

Welche Möglichkeiten gibt es, die Reihenfolge der ausgeführten Methoden zu manipulieren, so dass bei "LoadDataSnapshot();" auch direkt der Listener gecalled wird?

Ich hoffe ich habe mein Problem verständlich beschrieben.
Ich freue mich auf Antworten!

Grüße:
Max

16.842 Beiträge seit 2008
vor 3 Jahren

Du hast hier Code, der seriell ausgeführt wird; also nacheinander.
Die Methode LoadDataSnapshot, die für uns hier nicht ersichtlich ist, blockiert offenbar Deinen Code - völlig normal soweit.

Leider ist eben nicht wirklich ersichtlich, was Du für einen Listener hast, sodass man im Endeffekt wenig sagen kann, wie Dein Vorhaben am besten zu lösen ist.
Die einfachste Variante ist natürlich LoadDataSnapshot in einen extra Task zu packen.

Im Endeffekt das gleiche Problem (und Lösung) wie [FAQ] Warum blockiert mein GUI?

D
261 Beiträge seit 2015
vor 3 Jahren

Ich hab zwar noch nie mit Firebase gearbeitet, aber für mich klingt das so als würdest einfach ein Event abonnieren und das Event wird eben irgendwann gefeuert. Das ist wie ein Mausklick in einer GUI Anwendung: Du kannst dort auch nicht erwarten, dass der Benutzer vor deinem Debug.Writeline("Line 2"); auf den Button klickt nur damit dein Code funktioniert.

Eventuell gibt es eine blockierende Methode um das gleiche Ergebnis zu erreichen?

@Abt: Ist nicht genau das Gegenteil sein Problem? Er hätte es gerne Seriell aber LoadDataSnapshot abonniert nur ein Event.

M
Maxteric Themenstarter:in
3 Beiträge seit 2020
vor 3 Jahren

Vielen Dank für deine Antwort!

Ich habe extra versucht meine Frage etwas allgemeiner zu halten nachdem mein Post auf StackOverflow gestern mit mehreren Referenzen etc. und zu komplexer Fragestellung nach nicht mal 3 Minuten geclosed wurde. 8o

Danke für den Hinweis mit dem Task. Ich werde später mal versuchen mein Code in Threads zu verpacken und schaue ob ich dann das gewünschte Ergebnis erzielen kann.

16.842 Beiträge seit 2008
vor 3 Jahren

Bitte in Tasks und nicht in Threads 😉
Task sind managed und viel einfacher und effizienter zu handlen als Threads.

Ansonsten bitte genauer erklären, was Du vor hast.
Zu allgemeine Fragen führen oft zu Missverständnissen, vor allem bei Helfern, die Deinen konkreten Fall nicht kennen und Deinen Code nicht vor Augen haben.

M
Maxteric Themenstarter:in
3 Beiträge seit 2020
vor 3 Jahren

Ich erkläre es mal etwas genauer.

Der User kann sich in der App via Firebase Authentificator einloggen.
Nach dem Login erscheint ein Loading Screen wo ich alle wichtigen Variablen initialisieren möchte.1. FirebaseApp initialisieren (geht problemlos)

  1. FirebaseDatabase referenz erstellen (geht auch)
  2. DatabaseSnapshot laden via OnValueChangeListener (geht nicht)
  3. Daten aus dem Snapshot laden

Hier ist ja nun der Fall, das bei Punkt 3 der Snapshot nicht geladen wird, da der dortige Listener erst nach Schritt 4 ausgeführt wird.

So wie ich dich jetzt verstanden habe wäre es ja sinnvoll diese Aufgaben in 2 Task zu separieren.

Task 11. FirebaseApp initialisieren

  1. FirebaseDatabase referenz
  2. DatabaseSnapshot laden via OnValueChangeListener
  3. (Ende des Task) - sollte ja jetzt am Ende des Task den Listener ausführen bevor er weiter macht

Task 21. Daten aus dem Snapshot laden

Habe ich das im groben richtig verstanden oder ist mein Verständnis wirklich so verkorkst? 🤔

4.942 Beiträge seit 2008
vor 3 Jahren

Wenn du in LoadDataSnapshot() nur das Listener-Event abonnierst, dann wird der darauffolgende Code einfach weiter ausgeführt.

Kannst du nicht in der Event-Methode dann den Snapshot laden?

Wenn dein weiteres Programm darauf erst warten soll - und es sich um eine Konsolenanwendung handelt (bzw. vor Application.Run()) -, dann kannst du z.B. eine von WaitHandle abgeleitete Klasse (z.B. AutoResetEvent) dafür verwenden.