Mar*_*tin 4 .net c# dispatchertimer
在Silverlight应用程序中,我有一段代码必须每500毫秒运行一次.我计划使用DispatcherTimer来实现这一点(参见下面的代码).
DispatcherTimer dt = new DispatcherTimer();
dt.Interval = new TimeSpan(0, 0, 0, 0, 500); // 500 Milliseconds
dt.Tick += new EventHandler(dt_Tick);
dt.Start();
Run Code Online (Sandbox Code Playgroud)
但是,可能会发生代码块执行时间超过500毫秒(代码块执行一些Web服务调用).如何确保当前正在进行呼叫,DispatcherTimer不会触发另一个事件?有什么选择,最好的方法是什么?使用锁?
在DispatcherTimer 仅运行调度线程上-所以没有办法,你可以在同一时间运行两个处理器.它们可能会排队等候并且直接运行一个,当然 - 你应该检查.
但是,您无论如何都不应该进行Web服务调用DispatcherTimer.在后台线程中执行此操作,否则您将阻止UI在您等待Web服务的所有时间进行更新.基本上你不应该在UI线程中做任何长时间运行的工作.使用其他各种计时器之一(例如System.Timers.Timer)定期在线程池线程上执行工作,并在需要在UI上显示某些数据时使用调度程序回调UI线程.
当然,现在你已经遇到了多种线程同时多次同时触发的新型定时器的潜在问题.避免这种情况的一个选择是将AutoReset属性设置为false,并且只安排当前结束时的下一个计时器滴答.
小智 1
我想说的是,如果时间太长,你就跳过一个刻度,否则你会因为锁而得到一个巨大的队列。
所以在事件处理程序中说:
if(!busy) {
busy = true;
// some code which could take longer than 500 ms
busy = false;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4383 次 |
| 最近记录: |