【发布时间】:2016-12-21 17:35:47
【问题描述】:
在我的控制台应用程序中,我有几个类(我们称它们为MyClass1,MyClass2,...)有一个方法可以检查数据库中某些记录的存在(不同的类等待不同的记录) 并且仅在需要的记录存在时才返回。我目前有一个使用无限循环和Thread.Sleep 的简单实现。这种方法确实有效,但它往往会导致高 CPU 负载。有什么方法可以让这些方法对 CPU 更友好?
public override void WaitForRecord()
{
MyDatabaseRecord record = null;
while (record == null)
{
Thread.Sleep(500);
using (var dc = new MyDataContext())
{
record = dc.Documents
.Where( /*condition*/)
.SingleOrDefault();
}
}
Logger.Info("Record with ID " + record.Id + " found at " + DateTime.Now)
}
这些方法的使用非常简单:调用代码创建一堆对象,使用Task.Factory.StartNew 启动每个对象的WaitForRecord 方法,定期检查是否有任何任务已完成执行,并在控制台中打印结果,如这个:
MyClass1 is still waiting for record...
MyClass2 has found the record...
...
【问题讨论】:
-
你试过用计时器吗?
-
无限循环在哪里?
-
@Default,我猜“无限”这个名字不是 100% 正确的。我的意思是“一个迭代次数不定并且可能是无限的循环”
-
@David,你能不能指点我一些文章来解释这些方法是如何“更好”的?
-
有关 thread.sleep 与 task.delay 的讨论,请参见 stackoverflow.com/questions/20082221/…。但实际上,两者都不会给 CPU 带来负担。推测 CPU 上的负载是因为您的实际查询需要时间,并且每 500 毫秒执行一次是相当激进的。减少负载的简单方法是增加睡眠时间。
标签: c# infinite-loop