【问题标题】:Accurate, Multithreaded Equivalent for System.Timers.Timer in Silverlight?Silverlight 中 System.Timers.Timer 的准确多线程等效项?
【发布时间】:2012-01-18 07:15:03
【问题描述】:

我在 WPF 应用程序中使用 System.Timers.Timer 有以下代码,并希望移植到 Silverlight。计时器在 WPF 中用于轮询高性能可视化组件的数据更新,因此 UI 线程完全运行。

    private System.Timers.Timer _timer;
    private const int TimerInterval = 10; 

    private void Start()
    {
        _timer = new Timer(TimerInterval);            
        _timer.Elapsed += OnTick;
        _timer.AutoReset = true;   
        _timer.Start();            
    }

    private void OnTick(object sender, EventArgs e) { } // ... 

具体要求如下:

我有一个使用 System.Timers.Timer 的 WPF 应用程序,它从外部硬件读取/缓冲数据 在加载到可视化组件之前,每 10 毫秒进行一次预处理。 客户希望看到此组件的 Silverlight 版本的演示 以相同的速率离线查看数据。

复制相同的 我创建了一个演示,其中每次都从嵌入式资源中读取虚拟数据 10ms 并推入可视化组件。调度器定时器 会打勾,但由于 UI 正在努力工作,所以 GUI 会卡顿。图形用户界面 可以处理更新率,只是从文件中读取/对该数据进行预处理 它需要以尽可能接近 100Hz 的速率进行多线程处理。

简而言之,无论 OnTick 处理程序持续时间如何,我希望计时器会定期触发直到停止,并且尽可能接近 10 毫秒。 Ontick 处理程序也应该发生在线程池(或后台)线程上,以允许以多线程方式读取/处理数据。

我看到 Silverlight 中有一个 System.Threading.Timer,但我不确定它的用法以及它与 Timers.Timer 版本的不同之处。

任何人都可以评论上述计时器代码的 Silverlight 的良好端口或实现上述要求的解决方法吗?

欢迎评论/建议。

最好的问候,

【问题讨论】:

标签: c# multithreading silverlight timer


【解决方案1】:

我从 msdn 论坛得到了关注 answe3r

一种方法是使用动画计时器而不是 System.Threading 计时器。这里有几篇描述它的博客文章......

http://blogs.msdn.com/jstegman/archive/2007/05/05/mix-createfromxaml-and-timer-sample.aspx

http://www.andybeaulieu.com/Home/tabid/67/EntryID/70/Default.aspx

【讨论】:

  • 感谢您的回答,我已经更新了我的 Q 以更清楚地说明需要与 UI 线程分离。有什么想法吗?
【解决方案2】:

碰巧的是,我使用了 System.Threading.Timer 并将其封装以创建与 Silverlight Timer 类似的 API。这对我的情况有所帮助,因为我将代码双重部署到 WPF 和 SL,因此不仅在寻找功能等效的代码,而且在这两种情况下都可以使用理想的代码。

以下测试可以正常工作,但不提供 System.Timers.Timer 的所有功能(例如同步)。如果有人愿意,我相信使用 Dispatcher 添加不会太难!

我有blogged about this here(以及秒表的替代品)。

无论如何,感谢您的 cmets 和建议,非常感谢他们。

最好的问候,

namespace System.Timers
{
    /// <summary>
    /// Drop in Silverlight compatible replacement for the System.Timers.Timer
    /// Doesn't do synchronisation
    /// </summary>
    public class Timer
    {
        private readonly uint _interval;
        private System.Threading.Timer _internalTimer;
        private const uint MaxTime = (uint)0xFFFFFFFD;

        public event EventHandler<EventArgs> Elapsed;

        public Timer(uint interval)
        {
            _interval = interval;
        }

        public bool AutoReset { get; set; }        

        public void Start()
        {
            Stop();
            _internalTimer = CreateTimer();            
        }        

        public void Stop()
        {
            if (_internalTimer != null)
            {

                _internalTimer.Change(MaxTime, MaxTime);
                _internalTimer.Dispose();
                _internalTimer = null;
            }
        }

        private Threading.Timer CreateTimer()
        {
            var timer = new System.Threading.Timer(InternalTick);
            timer.Change(_interval, AutoReset ? _interval : MaxTime);
            return timer;
        }

        private void InternalTick(object state)
        {
            var handler = Elapsed;
            if (handler != null)
            {
                handler(this, EventArgs.Empty);
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 2015-12-16
    • 1970-01-01
    • 2011-03-15
    • 2010-12-16
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 2013-05-22
    • 1970-01-01
    相关资源
    最近更新 更多