我正在开发一个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调度程序上调度的工作可能不会立即处理 - 它取决于调度程序的工作负载.
还要记住,此计时器与您的应用程序一起运行,并且在应用程序暂停时无法运行.
小智 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解决方案有什么优势,但它运行良好.