Таймер в приложении 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 часов.

Так что, по моему опыту, я думаю, что таймер диспетчера предпочтительнее, чем таймер пула потоков.

Это просто мой опыт его использования.