Я намерен использовать мониторинг на основе таймера для домашних заданий, таких как обрезка устаревших записей журнала и т. Д. Ниже приведен концептуальный код, который подписывается на событие таймера (деталь не показана, но основана на 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
}
Таймеры не являются прерываниями. Ваше предположение неверно. –
Кроме того, ваш служебный материал не должен находиться внутри RunAsync, что также аннулирует вашу логику «Отмена/запуск». –
Хорошо, возьми точку. Но вы все еще правильно понимаете мой вопрос? Я попытаюсь перефразировать. Да, теперь я вижу проблему с потоками, которую вы только что указали. Может ли то, что я прошу, невозможно? – user2921851