为什么Threading.Timer委托停止?

时间:2016-07-22 10:52:45

标签: c# multithreading timer

我的WPF应用程序在其早期的" bootstrap"中启动了Threading.Timer。处理。定时器间隔为100毫秒,定时器委托中的代码通常需要大约70毫秒(它在一系列for循环中执行许多操作,其中一些操作涉及从串行端口读取)。启动计时器后,初始化应用程序的其余部分(使用DI框架注册的类型,视图创建,视图模型,各种其他初始化函数)。在这几秒钟内,在计时器代理中执行的代码完全停止"停止"。它永远不会失败,并且它的所有串行读取都不会失败(这是否真的很幸运) - 定时器代码似乎暂停执行大约3秒钟。

我只能假设所有这些启动内容(在UI线程上)获得更高的优先级,防止计时器线程获得任何CPU时间。我能做些什么吗?稍后在引导过程中启动计时器可能是一个选项,但我想首先探索其他解决方案。

另一方面,Threading.Timer如何处理&#34; re-entrancy&#34; (如果这是正确的术语),即计时器&#34;滴答&#34;而之前的调用仍在运行?下一次调用是否排队等待&#34;并在前一个最终完成时运行,或者我是否需要自己处理它?<​​/ p>

1 个答案:

答案 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计时器都不适合实时使用。所以不,你无能为力。