Таймер в приложении UWP, который не связан с пользовательским интерфейсом
Я работаю над проектом MVWM UWP и хотел бы реализовать автоматическую систему выхода, если взаимодействие пользователя прекратится в течение определенного времени.
До сих пор я использую DispatcherTimer
для подсчета назад от 200 каждую секунду.
TimerLeave = 200;
var _dispatcherTimer = new DispatcherTimer();
_dispatcherTimer.Tick += dispatcherTimer_Tick;
_dispatcherTimer.Interval = new TimeSpan(0, 0, 1);
_dispatcherTimer.Start();
Но поскольку DispatcherTimer связан
с пользовательским интерфейсом, и я создаю приложение MVVM, я ищу альтернативу.
Я немного искал и нашел Запустить фоновое задание по таймеру. Проблема в
что этот таймер может быть настроен только на запуск каждые 15 минут, что слишком мало, чтобы автоматически выйти из системы в моем случае. Я не нашел обходного пути, чтобы сократить 15 минут.
Поэтому мой вопрос: есть ли возможность настроить таймер в проекте UWP, который не связан с пользовательским интерфейсом и может быть задан переменной?
Ответы
Ответ 1
Да, вы можете, например, использовать класс Timer, хотя вы должны помнить, что он работает в отдельном потоке. Пример:
private Timer timer;
public MainPage()
{
this.InitializeComponent();
timer = new Timer(timerCallback, null, (int)TimeSpan.FromMinutes(1).TotalMilliseconds, Timeout.Infinite);
}
private async void timerCallback(object state)
{
// do some work not connected with UI
await Window.Current.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,
() => {
// do some work on UI here;
});
}
Обратите внимание, что работа, отправленная диспетчеру пользовательского интерфейса, может быть обработана не сразу - она зависит от рабочей нагрузки диспетчера.
Также помните, что этот таймер работает вместе с вашим приложением и не будет работать, когда приложение приостановлено.
Ответ 2
Я недавно разрешил эту проблему, используя класс ThreadPoolTimer.
ThreadPoolTimer timer = ThreadPoolTimer.CreatePeriodicTimer((t) =>
{
//do some work \ dispatch to UI thread as needed
}, TimeSpan.FromMinutes(1));
В настоящее время я не знаю о преимуществах этого решения, уже опубликованного, но он хорошо функционировал.
Ответ 3
Вы можете быть правы в своем коде, но я использовал таймер пула потоков вместо таймера диспетчера, после ссылки на блог выше.
Если я говорю о начальном уровне, я использовал диспетчерский таймер для своего приложения, что происходит на самом деле, оно зависает после каждых 2 дней непрерывного ожидания. Поэтому я подумал о таймере пула потоков, о котором вы говорите в этом блоге, но в потоке потоков он завис через 5-6 часов.
Так что, по моему опыту, я думаю, что таймер диспетчера предпочтительнее, чем таймер пула потоков.
Это просто мой опыт его использования.