C# Windows服务里:Thread与Timer

时间:2021-02-23 20:38:38
应用场景:需要连续不断的于指定时间用 HttpWebRequest 获取数据分析并处理,任务量大,且要求一定的实时性。

当前状况:现在程序被做成了Windows服务(.NET2.0 + C#),问题就是实时性不强,有时要延迟数分钟。

当前使用的 Timer 每隔 200 毫秒检查:若达到指定时间,执行本次任务,服务启动时 CPU占用 0;尝试用 Thread 代替 Timer,改为:
while(true)
{
// 检查时间
// 执行任务
Thread.sleep(0);
}
这样是不是节省了200毫秒的时间开销?可是CPU 占用 50% 到 90% 波动,因为测试环境任务量小,不知道对减少延迟有没有帮助。

将 Timer 改为 Thread 主要是想下一步改为多线程,看能否提高效率。
希望大家给点建议

5 个解决方案

#1


while(true)
{
// 检查时间
// 执行任务
Thread.sleep(0);
}

这个不就是死循环?占50%到90%说明你机器是双核的,要是单核的直接100%

#2


改回sleep(200)吧

#3


while(true)
{
// 检查时间
// 执行任务
Thread.sleep(1);
}

改为1后应该还是一个死循环吧,不过 CPU 变成5%了

程序需要一个死循环,只有当关闭服务/服务器才结束。
都关闭服务/服务器了,死循环也会自动结束吧,还是要加段代码在关闭服务的时候使它跳出循环?

#4


好吧,我没表达清楚
我的意思那样写你cpu的一个核就死了

#5


每日一顶

#1


while(true)
{
// 检查时间
// 执行任务
Thread.sleep(0);
}

这个不就是死循环?占50%到90%说明你机器是双核的,要是单核的直接100%

#2


改回sleep(200)吧

#3


while(true)
{
// 检查时间
// 执行任务
Thread.sleep(1);
}

改为1后应该还是一个死循环吧,不过 CPU 变成5%了

程序需要一个死循环,只有当关闭服务/服务器才结束。
都关闭服务/服务器了,死循环也会自动结束吧,还是要加段代码在关闭服务的时候使它跳出循环?

#4


好吧,我没表达清楚
我的意思那样写你cpu的一个核就死了

#5


每日一顶