none
Zyklische Prüfung mit Task anstelle mit einem Thread RRS feed

  • Allgemeine Diskussion

  • Hallo zusammen,

    ich habe einen WatchDog, welcher einen Thread startet und in diesem irgendwelchen Prüfungen durchführt. Der Thread läuft über die Lebenszeit der Anwendung. Er soll alle fünf Minuten einige Prüfungsroutinen durchlaufen und danach wieder fünf Minuten warten. Dies soll er solange machen, bis die Anwendung beendet wird oder von "jemandem" anderen benachrichtigt wird die Prüfungsroutinen vor Ablauf der fünf Minuten durchzulaufen.

    private void ThreadProc()
    {
     while (true)
     {
      int notifiedEvent = WaitHandle.WaitAny(new[] {_stopEvent, _forceCheckEvent}, _cycle);
    
    // zyklische Prüfungen durchführen

    Wie kann ich dies bitte sauber mit einem Task umsetzen? Die Benachrichtigung würde ich mit einem CancellationTokenSource vermutlich machen.

    Danke und viele Grüße,
    Christian

    Mittwoch, 24. Juni 2015 15:19

Alle Antworten

  • Hallo,

    die verwendung von Task wie du es brauchst ist einfach.

    Ich verweise auf folgende Klassen:

    folgender code erlaubt dir zum Beispiel die Ausführung des Codes als asynhcorner Task-Vorgang:

    //
    // Erstellt einen Task und führt ihn aus.
    // Da der code void ist, wird nicht auf das Ende gewartet.
    // Für das warten bitte die 2. Version verwenden.
    // Beides Codes benötigen .NET 4.5
    // Ansonsten einfach die Task-Factory-Dokuemntation nachschauen, die bietet eine Alternative für Task.Run()
    // Der Zugriff auf die UI (wenn vorhanden) darf nicht ohne Dispatcher etc. erfolgen!
    //
    async void __TaskProcessorHost() {
        await Task.Run(()=> {
            // Der Code hier wird im Hintergrund ausgeführt
        });
    }
    
    
    async Task __TaskProcessorHostWaitable() {
        return Task.Run(()=> {
            // Der Code hier wird im Hintergrund ausgeführt
        });
    }
    
    //
    // Diese Version gibt sogar einen Rückgabewert <TRES> zurück
    //
    async Task<TRES> __TaskProcessorHostWaitable2<TRES>() {
        return Task.Run<TRES>(()=> {
            // Der Code hier wird im Hintergrund ausgeführt
            return null; // Standartwert zurückgeben (als Demo)
        });
    }


    © 2015 Thomas Roskop
    Germany //  Deutschland

    Mittwoch, 24. Juni 2015 16:30
  • Hallo Christian,

    ich würde nur die Prüfroutine in einen Task setzen und diesen mit einem Timer anstoßen.

    private void Form1_Load(object sender, EventArgs e)
            {
    
                Timer t = new Timer()
                {
                    Interval = 30000,
                    Enabled = true
                };
    
                t.Tick += t_Tick;
    
            }
    
            private void mach_was()
            {
                System.Threading.Tasks.Task.Factory.StartNew(() =>
                   {
                       //mach was ....
    
                   });
            }
    
            void t_Tick(object sender, EventArgs e)
            {
                mach_was();
            }

    Mittwoch, 24. Juni 2015 16:33
  • Anmerkung zu Desert-Fox,

    ich würde in deinem Code ein await/async einfügen:

    private async void mach_was()
    {
             await System.Threading.Tasks.Task.Factory.StartNew(() => {
                //mach was ....
             });
    }
    

    Andernfalls könnte es sein, dass der Vorgang synchon ausgeführt wird/garnicht gestartet wird.


    © 2015 Thomas Roskop
    Germany //  Deutschland

    Mittwoch, 24. Juni 2015 16:55
  • Hallo ChrisitianHavel,

    istder Threadnochaktuell?

    Gruß

    Aleksander


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht,  kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Montag, 6. Juli 2015 11:57