我的WPF应用程序在其早期的" bootstrap"中启动了Threading.Timer。处理。定时器间隔为100毫秒,定时器委托中的代码通常需要大约70毫秒(它在一系列for
循环中执行许多操作,其中一些操作涉及从串行端口读取)。启动计时器后,初始化应用程序的其余部分(使用DI框架注册的类型,视图创建,视图模型,各种其他初始化函数)。在这几秒钟内,在计时器代理中执行的代码完全停止"停止"。它永远不会失败,并且它的所有串行读取都不会失败(这是否真的很幸运) - 定时器代码似乎暂停执行大约3秒钟。
我只能假设所有这些启动内容(在UI线程上)获得更高的优先级,防止计时器线程获得任何CPU时间。我能做些什么吗?稍后在引导过程中启动计时器可能是一个选项,但我想首先探索其他解决方案。
另一方面,Threading.Timer如何处理&#34; re-entrancy&#34; (如果这是正确的术语),即计时器&#34;滴答&#34;而之前的调用仍在运行?下一次调用是否排队等待&#34;并在前一个最终完成时运行,或者我是否需要自己处理它?</ p>
答案 0 :(得分:1)
1)计时器在需要时立即启动任务,没有队列。您可以通过安排以下内容自行检查:
Console.WriteLine("Sleep");
Thread.Sleep(10000);
Console.WriteLine("Awaken");
你会看到一些这样的输出,周期为1秒:
Sleep
Sleep
Sleep
Sleep
Sleep
Sleep
Awaken
Awaken
Awaken
Awaken
...
2)你可以改变线程优先级,但它可能不会对你有任何好处。所有.net计时器都不适合实时使用。所以不,你无能为力。