Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Wieso triggert ein Worker eine Methode bis zu 6 mal?
boenz666
myCSharp.de - Member



Dabei seit:
Beiträge: 13

Themenstarter:

Wieso triggert ein Worker eine Methode bis zu 6 mal?

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15536
Herkunft: BW

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
boenz666
myCSharp.de - Member



Dabei seit:
Beiträge: 13

Themenstarter:

beantworten | zitieren | melden

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?
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von boenz666 am .
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15536
Herkunft: BW

beantworten | zitieren | melden

Meine Antwort war nur in Hinweis, dass ein Log manchmal doppelt schreibt, wenn es falsch konfiguriert ist.
Zitat von boenz666
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.
private Nachricht | Beiträge des Benutzers
boenz666
myCSharp.de - Member



Dabei seit:
Beiträge: 13

Themenstarter:

beantworten | zitieren | melden

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 :P
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15536
Herkunft: BW

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers