【发布时间】: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 的良好端口或实现上述要求的解决方法吗?
欢迎评论/建议。
最好的问候,
【问题讨论】:
-
也许你可以看看DispatchTimer as shown here
-
@V4Vendetta:DispatcherTimer 将在调度程序线程上触发; OP 明确表示他希望它在后台线程上触发。
-
@JonSkeet 准确地说,我的 UI 线程正在耗尽!
-
@JonSkeet 我想可能是 UI 线程太忙了,所以也许 dispatcher.begininvoke 会帮助排队
标签: c# multithreading silverlight timer