Laden...

Wieso triggert ein Worker eine Methode bis zu 6 mal?

Erstellt von boenz666 vor 3 Jahren Letzter Beitrag vor 3 Jahren 1.768 Views
B
boenz666 Themenstarter:in
13 Beiträge seit 2018
vor 3 Jahren
Wieso triggert ein Worker eine Methode bis zu 6 mal?

Hallo,

ich habe mir mal zum Test einen Worker nach Tutorial programmiert.
Dieser soll dann zukünftig in meiner Applikation im Hintergrund arbeiten und schreibt dann im DoWork() einfach nur erstmal einen LogText.
Später möchte ich das dann noch erweitern.

Der Worker funktioniert tatsächlich und schreibt laut Logcat auch den Logtext alle 15 Minuten aus.
Allerdings gibt es hier das Problem, dass der Worker scheinbar immer 6 mal den Logtext schreibt.
Beim Debuggen konnte ich feststellen, dass der Aufruf über Enqueue nur einmal durchlaufen wird, also der Fehler liegt nicht in der Activity.
In der DoWork() Methode läuft er allerdings mehrfach durch und teilweise auch nur zur Hälfte und startet dann einen neuen Methodenaufruf.

Weiß einer zufällig, weshalb der Worker die Methode DoWork() je Intanz nach Ablauf der 15 Minuten bei mir 6 mal durchläuft?

Aufruf in meiner Activity:


protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    Xamarin.Essentials.Platform.Init(this, savedInstanceState);
    SetContentView(Resource.Layout.activity_main);

    PeriodicWorkRequest taxWorkRequest = PeriodicWorkRequest.Builder.From<SearchWorker> (TimeSpan.FromMinutes(15)).Build();
    WorkManager.Instance.Enqueue(taxWorkRequest);
}

Workerklasse:


public class SearchWorker : Worker
{
    public SearchWorker(Context context, WorkerParameters workerParameters) : base(context, workerParameters)
    {

    }

    public override Result DoWork()
    {
        Android.Util.Log.Debug("TestWorker", $"Test abgeschlossen");              
        return Result.InvokeSuccess();
    }
}

Das Problem ist, dass ich danach mal testweise einen Mailversand von mir an mich gehangen habe, der mir dann auch tatsächlich wie im Logtext 6 mal ne Mail gleichzeitig schickt.

Oder muss man noch irgendwie sicherstellen, dass nicht mehrere Instanzen abgefragt werden?

16.835 Beiträge seit 2008
vor 3 Jahren

Nur weil es 6 mal geschrieben wird heisst es nicht, dass er 6 mal läuft.

Doppelte Logeinträge werden ganz oft durch fehlerhafte Configsettings erzeugt, zB dass mehrere Pipes aktiviert sind.
So wie Du hier loggst (statisch) spricht vieles dafür, dass das so nicht Sinn der Sache ist.

Auch ein ganz weit verbreiteter Fehler beim ILogger.

B
boenz666 Themenstarter:in
13 Beiträge seit 2018
vor 3 Jahren

Huhu Abt,

danke dir für deine felißigen Antworten immer 😉

Also ich verstehe deine Antwort leider nicht so ganz.

Ich habe hier ein Tutorial abprogrammiert.
Beim Debuggen des Projektes konnte ich sehen, dass er sofort mehrfach die DoWork() Methode durchläuft, bevor er für 15 Minuten Ruhe gibt.

Deinen Einwand mit den Logeinträgen kann ich nachvollziehen, wieso wird mir dann aber auch 6 Mal eine Mail vershcikt, wenn ich einen Mailversand ankoppel?
Also er durchläuft die Methode wirklich mehrfach.

Kann das auch ein Fehler inder Konfiguration sein?
Weißt du zufällig, wo man das konfiguriert?

16.835 Beiträge seit 2008
vor 3 Jahren

Meine Antwort war nur in Hinweis, dass ein Log manchmal doppelt schreibt, wenn es falsch konfiguriert ist.

Also er durchläuft die Methode wirklich mehrfach.

Dann schließt das primär mal das Log aus, wenn Du das schon festgestellt hast.

Ich vermute dann, dass Du den Task mittlerweile - durch das Debugging etc - mehrfach registriert hast.
Bin in Xamarin nicht mehr so git, aber IIRC kannst Du die Worker unique markieren, sodass Du diese definitiv nur ein mal registriert bzw. über den Namen registrieren.

Kurz gegoogelt findet man das: WorkManager.Instance is obsolete

Unabhängig vom Thema sieht man:

PeriodicWorkRequest MyTestWorkRequest = new PeriodicWorkRequest.Builder(typeof(AthanTime), 16, TimeUnit.Minutes).SetConstraints(Constraints.None).Build();
WorkManager.Instance.EnqueueUniquePeriodicWork("MyTestWorkRequest", ExistingPeriodicWorkPolicy.Keep, MyTestWorkRequest);

EnqueueUniquePeriodicWork ist wohl das, was Du willst.

B
boenz666 Themenstarter:in
13 Beiträge seit 2018
vor 3 Jahren

Nice danke dir vielmals. Lese mich mal ein und probier noch ein bischen rum. Auch wenn die Thematik durch den anderen Tip von dir im anderen Thread nun wohl leider obsolet ist, will ich da ja auch eine Lerneffekt haben. Und das mit der Registration von Tasks ist mir völlig neu 😛

16.835 Beiträge seit 2008
vor 3 Jahren

Wenn ich das richtig verstehe ist nur WorkManager.Instance obsolete, nicht EnqueueUniquePeriodicWork.

Die Instanz holt man wohl nun über einen Kontext statt über eine statische(?) Eigenschaft.
Genau hab ichs mir nicht angeschaut.