UWP 相当于 Timer.Elapsed 事件
UWP equivalent of Timer.Elapsed event
我需要每隔几分钟自动触发一个事件。我知道我可以使用 Windows Forms 应用程序中的 Timers.Elapsed 事件来做到这一点,如下所示。
using System.Timers;
namespace TimersDemo
{
public class Foo
{
System.Timers.Timer myTimer = new System.Timers.Timer();
public void StartTimers()
{
myTimer.Interval = 1;
myTimer.Elapsed += new System.Timers.ElapsedEventHandler(myTimer_Elapsed);
myTimer.Start();
}
void myTimer_Elapsed(object sender, EventArgs e)
{
myTimer.Stop();
//Execute your repeating task here
myTimer.Start();
}
}
}
我在谷歌上搜索了很多,并努力寻找 UWP 中与此等效的内容。
以下使用 DispatcherTimer 的代码片段应提供等效功能,它在 UI 线程上运行回调。
using Windows.UI.Xaml;
public class Foo
{
DispatcherTimer dispatcherTimer;
public void StartTimers()
{
dispatcherTimer = new DispatcherTimer();
dispatcherTimer.Tick += dispatcherTimer_Tick;
dispatcherTimer.Interval = new TimeSpan(0, 0, 1);
}
// callback runs on UI thread
void dispatcherTimer_Tick(object sender, object e)
{
// execute repeating task here
}
}
当UI线程不需要更新,只需要一个定时器时,可以使用ThreadPoolTimer,像这样
using Windows.System.Threading;
public class Foo
{
ThreadPoolTimer timer;
public void StartTimers()
{
timer = ThreadPoolTimer.CreatePeriodicTimer(TimerElapsedHandler, new TimeSpan(0, 0, 1));
}
private void TimerElapsedHandler(ThreadPoolTimer timer)
{
// execute repeating task here
}
}
最近我解决了类似的任务,当时我需要在 UWP 应用程序中进行定期计时器事件。
即使您使用 ThreadPoolTimer,您仍然可以从计时器事件处理程序对 UI 进行非阻塞调用。
它可以通过使用 Dispatcher 对象并调用其 RunAsync 方法来实现,如下所示:
TimeSpan period = TimeSpan.FromSeconds(60);
ThreadPoolTimer PeriodicTimer = ThreadPoolTimer.CreatePeriodicTimer((source) =>
{
//
// TODO: Work
//
//
// Update the UI thread by using the UI core dispatcher.
//
Dispatcher.RunAsync(CoreDispatcherPriority.High,
() =>
{
//
// UI components can be accessed within this scope.
//
});
}, period);
代码片段摘自这篇文章:Create a periodic work item.
希望对您有所帮助。
我需要每隔几分钟自动触发一个事件。我知道我可以使用 Windows Forms 应用程序中的 Timers.Elapsed 事件来做到这一点,如下所示。
using System.Timers;
namespace TimersDemo
{
public class Foo
{
System.Timers.Timer myTimer = new System.Timers.Timer();
public void StartTimers()
{
myTimer.Interval = 1;
myTimer.Elapsed += new System.Timers.ElapsedEventHandler(myTimer_Elapsed);
myTimer.Start();
}
void myTimer_Elapsed(object sender, EventArgs e)
{
myTimer.Stop();
//Execute your repeating task here
myTimer.Start();
}
}
}
我在谷歌上搜索了很多,并努力寻找 UWP 中与此等效的内容。
以下使用 DispatcherTimer 的代码片段应提供等效功能,它在 UI 线程上运行回调。
using Windows.UI.Xaml;
public class Foo
{
DispatcherTimer dispatcherTimer;
public void StartTimers()
{
dispatcherTimer = new DispatcherTimer();
dispatcherTimer.Tick += dispatcherTimer_Tick;
dispatcherTimer.Interval = new TimeSpan(0, 0, 1);
}
// callback runs on UI thread
void dispatcherTimer_Tick(object sender, object e)
{
// execute repeating task here
}
}
当UI线程不需要更新,只需要一个定时器时,可以使用ThreadPoolTimer,像这样
using Windows.System.Threading;
public class Foo
{
ThreadPoolTimer timer;
public void StartTimers()
{
timer = ThreadPoolTimer.CreatePeriodicTimer(TimerElapsedHandler, new TimeSpan(0, 0, 1));
}
private void TimerElapsedHandler(ThreadPoolTimer timer)
{
// execute repeating task here
}
}
最近我解决了类似的任务,当时我需要在 UWP 应用程序中进行定期计时器事件。
即使您使用 ThreadPoolTimer,您仍然可以从计时器事件处理程序对 UI 进行非阻塞调用。 它可以通过使用 Dispatcher 对象并调用其 RunAsync 方法来实现,如下所示:
TimeSpan period = TimeSpan.FromSeconds(60);
ThreadPoolTimer PeriodicTimer = ThreadPoolTimer.CreatePeriodicTimer((source) =>
{
//
// TODO: Work
//
//
// Update the UI thread by using the UI core dispatcher.
//
Dispatcher.RunAsync(CoreDispatcherPriority.High,
() =>
{
//
// UI components can be accessed within this scope.
//
});
}, period);
代码片段摘自这篇文章:Create a periodic work item.
希望对您有所帮助。