C# 线程、事件和数据库

C# 线程、事件和数据库,c#,sql,multithreading,events,C#,Sql,Multithreading,Events,好的,所以我对数据库不是很熟悉,所以可能有一个简单的解决方案,我不知道 我有一个SQL数据库,由我的c#应用程序中的一个类管理。我想让这个类做的是不断地检查数据库,看看是否有新的数据。如果有新数据,我希望它触发另一个类将侦听的事件。现在我猜我需要实现一个线程,每隔一个ms或其他什么时间检查一次数据库。然而,我需要寻找什么才能启动我的活动?当有新条目时,数据库能否通知类?如果您使用的是MS SQLServer,则可以使用.NET Framework中的类来获取有关数据库更改的通知 也许其他数据库系

好的,所以我对数据库不是很熟悉,所以可能有一个简单的解决方案,我不知道


我有一个SQL数据库,由我的c#应用程序中的一个类管理。我想让这个类做的是不断地检查数据库,看看是否有新的数据。如果有新数据,我希望它触发另一个类将侦听的事件。现在我猜我需要实现一个线程,每隔一个ms或其他什么时间检查一次数据库。然而,我需要寻找什么才能启动我的活动?当有新条目时,数据库能否通知类?

如果您使用的是MS SQLServer,则可以使用.NET Framework中的类来获取有关数据库更改的通知

也许其他数据库系统的数据库驱动程序包中也有类似的机制

如果出于任何原因无法使用它,则需要一个线程来定期轮询数据库

除了使用,您还可以使用,或者如果您对对象使用ASP.NET或MVC。不建议使用1ms的间隔,因为您可能无法在下一次检查开始之前完成检查,因此您的数据库负载将非常高。您还可以确保使用
Timer.AutoReset
属性,这样您就不会让呼叫互相绊倒

编辑2:显示如何使用
SqlDependency
,包括必须使用。使用
SqlDependency
有很多考虑因素,例如,它实际上是为创建有限观察者的web服务器设计的,而不是为桌面应用程序设计的,所以请记住这一点。有一篇关于BOL的文章很好地介绍了这一点,它强调了查询通知是有用的

如果查询中的数据更改相对较少,如果数据更改时应用程序不需要即时更新,并且查询是否满足创建通知查询中概述的要求和限制

在您的示例中,您建议需要1ms的延迟,因此依赖类可能不是您的最佳方式(也请参阅我稍后对延迟要求的评论)

编辑:例如(使用计时器):

至于要检查什么,这取决于您实际想要检测的更改。以下是一些想法:

  • 表行计数(但如果自上次检查后添加和删除了行,则会很危险)
  • 表id列的最大值(仅当数字标识字段在增加时有效,并且仅用于检查新行)
  • 检查要查看的特定行中各个列的更改
  • 使用列中的一行检查单个行上的更改
  • 请编写者使用您可以检查的更改引用id更新单独的表
  • 使用审核表记录更改,并检查新的审核记录
您需要更好地定义变更监控的范围,然后才能得到一个好的答案

延迟


还要问问自己,更改更新是否真的需要1ms的延迟。如果你这样做,完全不同的方法可能会更好。例如,您可能需要使用数据写入程序的通知机制来通知应用程序中需要知道当前已发生更新的部分。

1.如果您希望数据库通知您的应用程序有关更改,则可以使用用户代理(首先要使数据库支持代理,然后编写一些代码以便“附加”代理。)对于应用程序,您需要SqlDependency类

有用链接:

若您想检查多个查询,那个么请注意代理有点麻烦

2.如果希望应用程序完成所有工作,则必须创建一个函数来检查所选表的校验和,每次都保留最后一次校验和,如果发现任何差异,则将“点击”数据库以获取新数据

你必须决定谁来做你所有的工作!
希望有帮助。

您可以使用计时器来完成。什么类型的数据库?
class Program
{
    static void Main(string[] args)
    {
        Timer timer = new Timer(1);
        timer.Elapsed += timer_Elapsed;
        timer.AutoReset = false;
        timer.Enabled = true;
    }

    static void timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        Timer timer = (Timer)sender;
        try
        {
            //  do the checks here
        }
        finally
        {
            //  re=enable the timer to check again very soon
            timer.Enabled = true;
        }
    }
}