当前位置:  开发笔记 > 编程语言 > 正文

UWP App中的计时器未链接到UI

如何解决《UWPApp中的计时器未链接到UI》经验,为你挑选了2个好方法。

我正在开发一个UWP MVVM项目,并希望在用户交互停止一段特定时间时实现自动注销系统.
到现在为止,我DispatcherTimer每秒使用a 从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> Romasz..:

是的 - 您可以使用例如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调度程序上调度的工作可能不会立即处理 - 它取决于调度程序的工作负载.

还要记住,此计时器与您的应用程序一起运行,并且在应用程序暂停时无法运行.


这引发了空引用异常,而/sf/ask/17360801/为我工作。

2> 小智..:

我最近使用ThreadPoolTimer类解决了这个问题.

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

目前我不知道这已经发布的Timer解决方案有什么优势,但它运行良好.


测试了两个解决方案.ThreadPoolTimer比Timer更准确.会用它.
推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有