Silverlight中System.Timers.Timer的准确,多线程等效?

时间:2012-01-18 07:15:04

标签: c# multithreading silverlight timer

我在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应用程序,它从外部硬件读取/缓冲数据   在加载到可视化组件之前,每10ms和预处理。   客户希望看到该组件的Silverlight版本的演示   以相同的速率离线查看数据。

     

复制相同的内容   我创建了一个演示,其中每个都从嵌入式资源中读取虚拟数据   10ms并推入可视化组件。 DispatcherTimer   会打勾,但由于用户界面很努力,GUI会断断续续。 GUI   可以处理更新速率,只需读取文件/预处理此数据   需要以尽可能接近100Hz的速率进行多线程处理。

简而言之,我希望定时器能够定期发射直到停止并且尽可能接近10毫秒而不管OnTick处理程序的持续时间。 Ontick处理程序也应该出现在线程池(或后台)线程上,以允许以多线程方式进行数据读取/处理。

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

任何人都可以在上面的定时器代码上找到Silverlight的好端口或者解决方法来实现上述要求吗?

欢迎提出意见/建议。

致以最诚挚的问候,

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

实际上,我使用了System.Threading.Timer并将其包装起来,以创建一个类似于Silverlight Timer的API。这有助于我的情况,因为我将代码双重部署到WPF和SL,因此不仅寻找功能等效,而且理想情况下我可以在两种情况下使用代码。

以下测试工作但不提供System.Timers.Timer的所有功能(例如同步)。我敢肯定,如果有人这么倾向,使用Dispatcher添加就不会太难了!

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

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

致以最诚挚的问候,

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);
            }
        }
    }
}