【发布时间】:2017-01-26 10:35:27
【问题描述】:
我正在使用 System.Threading Timers 轮询不同线程上的传感器(由于通信延迟,一次一个很慢)。它还允许用户通过更改计时器周期来更改轮询率。
我无法解决的是如果计时器在下一个周期之前没有完成会发生什么。我写了一个测试程序,但它并没有真正回答任何问题。
如果我有一个函数需要大约 1.7 秒的时间运行并每 10 秒调用一次,它会在下一个开始之前完成,我的 CPU 使用率在 13%(一个核心 100%)和 0% 之间波动。
t = new Timer(doWork, null, 0, 10000);
private void doWork(object o)
{
for(int i = 0; i < numberItts; i++)
{
}
}
如果我随后将计时器周期降低到 1 秒,我希望它要么在前一个线程完成之前不执行线程,要么继续产生新线程,并且随着更多线程在其他线程完成之前启动,CPU 使用率会攀升。实际情况是 CPU 使用率在 13% 和 25% 之间波动。
将周期更改为 500 毫秒,CPU 使用率在 38% 和 50% 之间波动。当然,在这一点上,它们的开始应该比结束要快得多。
这些线程是如何管理的?当轮询速率快于线程可以完成的速率时,什么限制了创建的数量?
【问题讨论】:
标签: c# multithreading timer