替换无限循环

本文关键字:无限循环 替换 | 更新日期: 2023-09-27 18:02:38

在我的控制台应用程序中,我有几个类(我们称它们为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...
...

替换无限循环

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

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