metro app(.NET)中受控的非UI计时器

前端之家收集整理的这篇文章主要介绍了metro app(.NET)中受控的非UI计时器前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要一个计时器类,它应该提供启动/停止/启用/禁用的功能,并且应该是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();
    }
}

猜你在找的Windows相关文章