2016-10-09 10 views
0

Я намерен использовать мониторинг на основе таймера для домашних заданий, таких как обрезка устаревших записей журнала и т. Д. Ниже приведен концептуальный код, который подписывается на событие таймера (деталь не показана, но основана на ThreadPoolTimer и легко понять). После этого вы увидите отредактированный код.Как узнать, где произошло прерывание таймера

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 
} 

Мой вопрос - когда событие таймера происходит и начинается, можно узнать, где, в приложении, произошло событие таймера, то есть, в котором объект и метод произошло событие? Цель состоит в том, чтобы просто дать понять, где произошло событие, чтобы решить, выполнять ли задание по времени.

Я понятия не имею, есть ли механизм для проверки трассировки потока программы на языке высокого уровня, например C# (я знаю, что регистр стека из дней микропроцессора). Я предполагаю, что есть простое решение этого, в противном случае я могу думать о неряшливом обходном пути, сохраняя имя текущего исполняемого метода для глобальной переменной, но это кажется утомительным.

Редакция:

К сожалению - с помощью await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Low,() => (в основном потоке) была непреднамеренным (вырезать и вставить ошибку). Также прерывание заменено на событие основано на обратной связи комментария.

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

Таймеры не являются прерываниями. Ваше предположение неверно. –

+1

Кроме того, ваш служебный материал не должен находиться внутри RunAsync, что также аннулирует вашу логику «Отмена/запуск». –

+0

Хорошо, возьми точку. Но вы все еще правильно понимаете мой вопрос? Я попытаюсь перефразировать. Да, теперь я вижу проблему с потоками, которую вы только что указали. Может ли то, что я прошу, невозможно? – user2921851

ответ

2

Чтобы включить комментарий след в ответ,

  • Когда работа свет, используйте DispatcherTimer и удалить RunAsync. Ты уже в главной теме.

  • Для тяжелых работ запустите его с помощью резьбового таймера и убедитесь, что весь код, касающийся пользовательского интерфейса, является потокобезопасным. Это означает Dispatcher.RunAsync() для небольших выбранных частей.

Узнать, что делает основная нить, не будет практичным. Но вы можете установить забор (простой глобальный логический) из кода, который хочет работать в одиночку. Поток может отступить, увидев это.

 Смежные вопросы

  • Нет связанных вопросов^_^