metro app(.NET)中受控的非UI计时器
发布时间:2020-12-14 05:28:27 所属栏目:Windows 来源:网络整理
导读:我需要一个计时器类,它应该提供启动/停止/启用/禁用的功能,并且应该是NON UI. 我看到2个选项 DispatcherTimer – 除了在UI线程上执行之外,它具有所有功能 ThreadPoolTimer – 无法控制周期性计时器. 我正在考虑在线程池计时器上创建包装器,但似乎非常复杂,因
我需要一个计时器类,它应该提供启动/停止/启用/禁用的功能,并且应该是NON UI.
我看到2个选项 > DispatcherTimer – >除了在UI线程上执行之外,它具有所有功能 我正在考虑在线程池计时器上创建包装器,但似乎非常复杂,因为没有/有限的控制它. 如何为所述场景视图设计计时器类. (我需要类似于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(); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- windows-sbs – 新SysAdmin的资源? (强调Windows SBS,Exch
- 在Windows下使用gcc安装gtk并进行编译?
- 调试 – 使用Fiddler调试Windows Phone 7模拟器
- windows-8 – Webview在外部浏览器中打开链接时忽略#(hash)
- powershell – 我的服务帐户需要什么来解决robocopy中的“管
- Windows – 微软仍然支持WIN吗?
- Windows Phone 7相当于Android的WebView
- windows – VIM:如何根据缓冲区映射命令?
- windows – 单元测试内核驱动程序
- windows – Batch Scripting Adventure