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

cro*_*oxy 15 c# timer uwp

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

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

_dispatcherTimer.Start();
Run Code Online (Sandbox Code Playgroud)

但是因为DispatcherTimer与UI链接而我正在构建MVVM应用程序,所以我正在寻找替代方案.
我搜索了一下,发现在计时器上运行后台任务.问题是这个计时器只能设置为每15分钟运行一次,这在我的情况下自动注销用户有点太长了.我找不到减少15分钟的解决方法.
所以我的问题是,是否有可能在UWP项目中设置一个没有链接到UI并且可以设置变量的计时器?

Rom*_*asz 20

是的 - 您可以使用例如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;
        });
}
Run Code Online (Sandbox Code Playgroud)

请注意,在UI调度程序上调度的工作可能不会立即处理 - 它取决于调度程序的工作负载.

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

  • 这引发了空引用异常,而/sf/answers/1938862481/为我工作。 (2认同)

小智 10

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

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

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

  • 测试了两个解决方案.ThreadPoolTimer比Timer更准确.会用它. (2认同)