Laden...

Xamarin: Async Commands wenn App pausiert/beendet wird

Erstellt von Palladin007 vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.128 Views
Palladin007 Themenstarter:in
2.080 Beiträge seit 2012
vor 5 Jahren
Xamarin: Async Commands wenn App pausiert/beendet wird

Guten Mittag,

ich arbeite an einer Xamarin-App, die auf IoC (Microsoft.Extensions.DependencyInjection) aufbaut und viel mit einer Server-Anwendung kommuniziert. Hierfür sind asynchrone Commands nötig, die auch mal mehrere Sekunden laufen können.

Nun kann es sein, dass der Nutzer die App, während so ein Command läuft, beendet oder in den Hintergrund schiebt. Ich weiß dabei nicht, ob die App beendet wird oder später weiter arbeiten soll. Das heißt, dass ich in jedem Fall davon ausgehen muss, dass sie beendet wird. Gleichzeitig muss die App aber den Status erhalten können, damit der Nutzer später dort weiter arbeiten kann, wo er aufgehört hat.

Das große Problem dabei sind asynchron arbeitende Commands. Die brauchen häufig z.B. eine lokale Datenbank-Verbindung, irgendwelche Funktionen vom Gerät, eine Server-Verbindung, etc. Diese Funktionen sind im IoC-Container als Scoped hinterlegt, ich erstelle also einen Scope, erledige die Arbeit und dispose danach diesen Scope. Die Problematik dabei ist, wenn ich global den ServiceProvider dispose, wird der Scope disposed und der disposed die verwendeten Ressourcen. Mein Konzept funktioniert hier nicht, ich müsste einen neuen Scope öffnen.

Meine Frage ist jetzt: Wie gehe ich mit solchen Commands um, wenn die App beendet wird?

Mir fallen nur zwei Möglichkeiten ein:1.radikal abbrechen und später eine Fehlermeldung zeigen 1.nichts disposen, bis die Arbeit beendet ist. Dabei gehe ich das Risiko ein, dass die App zu einem ungünstigen Zeitpunkt hart beendet wird.

Was meint ihr?
Option 1 finde ich unschön, aber aus meiner Sicht kommt Option 2 auch nicht in Frage.
Wie machen das denn andere Apps, hat vielleicht jemand eine andere Idee?

Beste Grüße

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

W
955 Beiträge seit 2010
vor 5 Jahren

Mit CancellationTokens arbeiten.

Palladin007 Themenstarter:in
2.080 Beiträge seit 2012
vor 5 Jahren

Aber wie der Name schon sagt: CancellationToken
Ich weiß, was das ist und weil ich die verwende, kann ich die Commands auch abbrechen.

Ich frage aber nach anderen Ideen, wie ich z.B. erreichen kann, dass ich den Command nicht abbrechen muss, sondern pausieren kann. Alle paar Zeilen oder vor jedem aufwändigen Stück Code ein WaitOne (siehe WaitHandle) einzubauen, was pausiert, wenn die App aus ist, ist ja kein Problem, aber die Datenbank-Verbindung muss ich trotzdem schließen können.

Deine Antwort klingt aber so, als siehst Du nur die eine Option: Abbrechen

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.