我在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的好端口或者解决方法来实现上述要求吗?
欢迎提出意见/建议。
致以最诚挚的问候,
答案 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);
}
}
}
}