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
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?
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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.
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.
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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)
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
Task 21. Daten aus dem Snapshot laden
Habe ich das im groben richtig verstanden oder ist mein Verständnis wirklich so verkorkst? 🤔
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.