【问题标题】:Replacement for infinite loop替换无限循环
【发布时间】:2016-12-21 17:35:47
【问题描述】:

在我的控制台应用程序中,我有几个类(我们称它们为MyClass1MyClass2,...)有一个方法可以检查数据库中某些记录的存在(不同的类等待不同的记录) 并且仅在需要的记录存在时才返回。我目前有一个使用无限循环和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


【解决方案1】:

假设您要连接到 SQL(2005 或更高版本)数据库,您可以查看 SqlDependency。这是一篇关于SqlDependency和EF的代码项目的文章:

http://www.codeproject.com/Articles/496484/SqlDependency-with-Entity-Framework

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 2013-05-19
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    相关资源
    最近更新 更多