我需要一个计时器类,它应该提供启动/停止/启用/禁用的功能,并且应该是NON UI.
我看到2个选项
> DispatcherTimer – >除了在UI线程上执行之外,它具有所有功能
> ThreadPoolTimer – >无法控制周期性计时器.
我正在考虑在线程池计时器上创建包装器,但似乎非常复杂,因为没有/有限的控制它.
如何为所述场景视图设计计时器类. (我需要类似于System.Threading.Timer的东西).
解决方法
由于UI应该在Metro应用程序中响应非常快 – 运行DispatcherTimer并在您希望在后台线程上运行的事物上调用Task.Run()就足够了.
如果这对你不起作用 – 看看是否这样.它应该具有与DispatcherTimer类似的API,但是在不同的线程上运行.并不是说它一直在等待Interval设置的持续时间,所以计时器将会非常晚.它也不完全是线程安全的,我只玩了10分钟,所以它可能并不总是有效,但由于它是开源的 – 你可以修改它以适合你的账单.
public class BackgroundTimer { private AutoResetEvent _stopRequestEvent; private AutoResetEvent _stoppedEvent; #region Interval private TimeSpan _interval; public TimeSpan Interval { get { return _interval; } set { if (IsEnabled) { Stop(); _interval = value; Start(); } else { _interval = value; } } } #endregion public event EventHandler<object> Tick; #region IsEnabled private bool _isEnabled; public bool IsEnabled { get { return _isEnabled; } set { if (_isEnabled == value) return; if (value) Start(); else Stop(); } } #endregion public BackgroundTimer() { _stopRequestEvent = new AutoResetEvent(false); _stoppedEvent = new AutoResetEvent(false); } public void Start() { if (_isEnabled) { return; } _isEnabled = true; _stopRequestEvent.Reset(); Task.Run((Action)Run); } public void Stop() { if (!_isEnabled) { return; } _isEnabled = false; _stopRequestEvent.Set(); _stoppedEvent.WaitOne(); } private void Run() { while (_isEnabled) { _stopRequestEvent.WaitOne(_interval); if (_isEnabled && Tick != null) { Tick(this,null); } } _stoppedEvent.Set(); } }