UWP应用中不与UI相关联的定时器

20

我正在开发一个UWP MVVM项目,希望实现一个自动注销系统,如果用户交互停止一段特定的时间。
目前我正在使用一个 DispatcherTimer 每秒倒数从200。

TimerLeave = 200;
var _dispatcherTimer = new DispatcherTimer();
_dispatcherTimer.Tick += dispatcherTimer_Tick;
_dispatcherTimer.Interval = new TimeSpan(0, 0, 1);

_dispatcherTimer.Start();

但是因为DispatcherTimer与UI相关,而我正在构建一个MVVM应用程序,所以我正在寻找一种替代方案。
我进行了一些搜索,并找到了定时器上运行后台任务。问题在于该计时器只能设置为每15分钟运行一次,对于自动注销用户来说有点太长了,我没有找到减少15分钟的变通方法。
所以我的问题是,在UWP项目中是否有可能设置一个不与UI相关且可设置变量的计时器?


1
你有检查这个吗:链接 - Antonio Ugraal Barile
1
@AntonioUgraalBarile,我完全错过了System.Threading.Timer,感谢您的提示。我只找到了System.Timer,但在UWP应用程序中不受支持。 - croxy
3个回答

26

是的 - 例如,您可以使用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;
        });
}

请注意,通过UI dispatcher分配的工作可能不会立即处理-这取决于dispatcher的负载。

同时请记住,此计时器与您的应用程序一起运行,并且在应用程序挂起时不起作用。


完美的答案! - Syaiful Nizam Yahya
3
这引发了空引用异常,而https://dev59.com/n2Ik5IYBdhLWcg3wYtFC#27698035对我有用。 - Iiridayn
@Iiridayn 这只是获取调度程序的一种方式,你也可以用其他方式获取它。只是要确保你能够访问它。 - Romasz

12

我最近使用ThreadPoolTimer类成功解决了这个问题。

ThreadPoolTimer timer = ThreadPoolTimer.CreatePeriodicTimer((t) =>
        {
            //do some work \ dispatch to UI thread as needed
        }, TimeSpan.FromMinutes(1));

目前我不知道这种方法与已发布的计时器解决方案相比有什么优势,但它一直运行良好。


2
测试了两种解决方案。ThreadPoolTimer比Timer更准确。将使用它。 - x2.

0

你的代码可能是正确的,但我在参考了上面的博客后使用了线程池计时器而不是调度计时器。

如果我谈论初始级别,我曾经为我的应用程序使用调度计时器,实际上会发生什么,它在连续待机2天后就会挂起。

所以我想到了线程池计时器,就像你在这篇博客中提到的那样,但在线程池中,它只持续了5-6个小时就挂起了。

因此,根据我的经验,我认为调度计时器比线程池计时器更可取。

这只是我使用它的经验。


你能把这个转化为本页面顶部问题的答案吗?这不是博客,而是一个问答社区。因此,当你开始在适当标记为“你的答案”的字段中输入时,你应该回答问题。 - Yunnosch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接