2016-07-22 41 views
-1

我的WPF应用程序在其“引导”过程中很早就启动了Threading.Timer。定时器间隔为100ms,定时器代表中的代码通常需要大约70ms(它在一系列for循环中执行一些操作,其中一些涉及从串行端口读取)。启动计时器后,应用程序的其余部分被初始化(在DI框架中注册的类型,视图的创建,视图模型,各种其他初始化函数)。在这几秒钟内,在定时器代理中执行的代码完全“失速”。它永远不会失败,并且它的连续读取都不会失败(不管这纯粹是运气) - 计时器代码似乎暂停执行大约3秒钟。为什么Threading.Timer委托失速?

我只能假设所有启动的东西(在UI线程上)获得更高的优先级,从而阻止计时器线程获取任何CPU时间。有什么我可以做的吗?在启动过程中稍后启动计时器可能是一种选择,但我想首先探索其他解决方案。请注意,Threading.Timer如何处理“重入”(如果这是正确的术语),即在前一次调用仍在运行时计时器“打勾”?当前一个调用最终完成时,下一个调用是否“排队”并运行?还是我需要自己处理?

回答

1

1)定时器在需要时立即启动任务,不需要队列。

Console.WriteLine("Sleep"); 
Thread.Sleep(10000); 
Console.WriteLine("Awaken"); 

你会看到一些像这样的输出,1秒的周期:你可以自己与计划是这样的检查

Sleep 
Sleep 
Sleep 
Sleep 
Sleep 
Sleep 
Awaken 
Awaken 
Awaken 
Awaken 
... 

2)你可以改变线程的优先级,但它可能赢你没有任何好处。所有.net计时器都不适合实时使用。所以不,你无能为力。

相关问题