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.
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.