我尝试在Windows手机计时器中创建,每10-15毫秒更新一次(对于UI元素)。我希望有机会追加时间。所以我创建TimeSpan和DispatcherTimer,其中interval = 15 ms。所以每15毫秒调用一次事件,其中i减去15 ms到timeSpan,当timepan< = 0时,我调用一些方法。当我设置TimeSpan 4秒(例如)时,生命超过4秒约4,6秒。我也尝试使用async / await,但这确实无效。我尝试使用System.Threading,但我不知道如何更新在另一个线程中创建的元素。
答案 0 :(得分:2)
所以每15毫秒调用一次事件,其中我减去15毫秒到timeSpan
这就是你的问题。
在任何Windows平台上设置计时器时,您都无法获得高精度。在桌面上我相信消费者硬件上的正常调度时间约为12毫秒(当然其他应用程序可以大大减少它)。我不知道电话的时间安排是什么,但我认为它不如桌面准确(出于电池寿命的原因)。
所以,你根本无法在Windows上以这种方式解决这个问题,因为你不能假设计时器会每15ms触发一次。相反,只需将DispatcherTimer
启动到您需要的全部时间范围,例如4秒。
答案 1 :(得分:2)
So every 15 ms call the event where i subtract 15 ms to timeSpan and when timespan <= 0 i call some method.
你的逻辑是有缺陷的。你不可能以这种方式更新你的时间跨度,因为:
要获得准确的时间,您需要存储启动它的时间戳(使用DateTime.UtcNow
检索它。每次计时器勾选时,请采用新的时间戳并减去您保存的时间戳。方式,你确切地知道已经过了多少时间,你的计时器永远不会漂移。
private DateTime start; // Set this with DateTime.UtcNow when starting the timer
void timer_Tick(object sender, EventArgs e)
{
// Compute the new timespan
var timespan = DateTime.UtcNow - start;
// Do whatever with it (check if it's greater than 4 seconds, display it, ...)
}
答案 2 :(得分:0)
尝试此更新计时器线程中的UI元素
Dispatcher.BeginInvoke(() =>
{
//Update Your Element.
});