加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

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

发布时间:2020-12-14 05:28:27 所属栏目:Windows 来源:网络整理
导读:我需要一个计时器类,它应该提供启动/停止/启用/禁用的功能,并且应该是NON UI. 我看到2个选项 DispatcherTimer – 除了在UI线程上执行之外,它具有所有功能 ThreadPoolTimer – 无法控制周期性计时器. 我正在考虑在线程池计时器上创建包装器,但似乎非常复杂,因
我需要一个计时器类,它应该提供启动/停止/启用/禁用的功能,并且应该是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();
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读