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
