Timer in UWP App which isn't linked to the UI

2019-01-19 11:02发布

问题:

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?

回答1:

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.



回答2:

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.



标签: c# timer uwp