2016-10-09 8 views
0

Ich beabsichtige, eine Timer-basierte Überwachung für Hausaufgaben wie abgestorbene Protokolleinträge usw. verwenden. Das folgende zeigt einen konzeptionellen Code, der ein Timer-Ereignis abonniert (Detail nicht gezeigt, aber basierend auf ThreadPoolTimer und leicht zu verstehen). Bitte beachten Sie den bearbeiteten Code, der nach diesem angezeigt wird.Wie finde ich heraus, wo der Timer-Interrupt aufgetreten ist

public void StartMonitoring() 
{ 
    TimerService.ElapsedTimerHandler += async (timer) => 
    { 
     await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Low,() => 
     { 
      TimerService.Cancel();  // stop further interrupts until this is done 

      // do the house-keeping tasks here. 

      TimerService.Start(300000); // here after check every 5 minutes 
     }); 

    }; 

    TimerService.Start(30000); // make first call after 30 sec 
} 

Meine Frage ist - wenn das Timer-Ereignis auftritt und beginnt, ist es möglich, zu wissen, wo, in der App, das Timer-Ereignis aufgetreten ist, in dem Sinne Objekt und Methode des Ereignis aufgetreten ist? Das Ziel ist einfach, einen Hinweis darauf zu erhalten, wo das Ereignis stattgefunden hat, um zu entscheiden, ob die zeitgesteuerte Aufgabe ausgeführt werden soll.

Ich habe keine Ahnung, ob es einen Mechanismus gibt, um Programmablaufverfolgung in Hochsprache wie C# (ich kenne Stack-Register von Mikroprozessor Tagen) zu untersuchen. Ich gehe davon aus, dass es eine einfache Lösung dafür gibt, wenn ich mir eine unordentliche Problemumgehung einfallen lasse, indem ich den Namen der aktuell ausgeführten Methode in einer globalen Variable abspeichern kann, aber das erscheint mühsam.

EDITED:

Sorry - die await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Low,() => (auf dem Hauptthread) unter Verwendung von (Ausschneiden und Einfügen Fehler) unbeabsichtigt war. Auch Interrupt ersetzt mit Ereignis basierend auf Kommentar Feedback.

public void StartMonitoring() 
{ 
    TimerService.ElapsedTimerHandler += async (timer) => 
    { 
      TimerService.Cancel();  // stop further interrupts until this is done 
      await DoSomeHouseKeepingTasks(); // do the house-keeping tasks here. 
      TimerService.Start(300000); // here after check every 5 minutes 
    }; 

    TimerService.Start(30000); // make first call after 30 sec 
} 
+1

Timer sind keine Interrupts. Deine Annahme ist falsch. –

+1

Außerdem sollten sich Ihre Haushaltsdaten nicht in RunAsync befinden und die Cancel/Start-Logik ungültig machen. –

+0

OK, nimm den Punkt. Aber du verstehst meine Frage immer noch richtig? Ich werde versuchen, sie umzuformulieren. Ja, ich kann jetzt das Threading-Problem sehen, auf das Sie gerade hingewiesen haben. Könnte das, was ich verlange, unmöglich sein? – user2921851

Antwort

2

Um den Kommentar Spur in einer Antwort zu drehen,

  • Wenn die Arbeit ist leicht, eine DispatcherTimer verwenden und die RunAsync entfernen. Du bist bereits auf dem Hauptthread.

  • Für schwere Arbeit führen Sie es von einem Threaded-Timer aus und stellen Sie sicher, dass der gesamte Code, der die Benutzeroberfläche berührt, Thread-sicher ist. Das bedeutet Dispatcher.RunAsync() für kleine ausgewählte Teile.

Herauszufinden, was der Hauptthread tut, wird nicht praktisch sein. Sie können jedoch einen Zaun (einen einfachen globalen booleschen Wert) aus Code festlegen, der alleine ausgeführt werden soll. Der Thread kann sich zurückziehen, wenn er das sieht.

Verwandte Themen