I'm working on an UWP MVVM project and would like to implement an automatic logout system if the user interaction stops for a specific time.
Until now I'm using a DispatcherTimer
to count backwards from 200 every second.
TimerLeave = 200;
var _dispatcherTimer = new DispatcherTimer();
_dispatcherTimer.Tick += dispatcherTimer_Tick;
_dispatcherTimer.Interval = new TimeSpan(0, 0, 1);
_dispatcherTimer.Start();
But because the DispatcherTimer is linked
with the UI and I'm building a MVVM App, I'm looking for an alternative.
I searched a bit and found Run a background task on a timer. The problem is
that this timer can only be set to run every 15 minutes, which is a little too long to automaticly logout a user in my case. I found no workaround to reduce the 15 minutes.
So my question is, is there any possibility to set up a timer in an UWP Project that isn't linked to the UI and can be set variable?
Yes - you can for example use Timer class - though you must remember that it run on separate thread. Example:
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;
});
}
Note that the work dispatched on UI dispatcher may not be processed right away - it depend on dispatcher's workload.
Also remember that this timer runs along with your app and won't work when app is suspended.
I resolved this issue recently using a ThreadPoolTimer class.
ThreadPoolTimer timer = ThreadPoolTimer.CreatePeriodicTimer((t) =>
{
//do some work \ dispatch to UI thread as needed
}, TimeSpan.FromMinutes(1));
At present I am not aware of any advantage of this over the Timer solution already posted, but it has functioned well.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With