c#
应用程序多次写入MS SQL
DB表。该表的记录必须由另一个CCD_ 3应用程序读取和处理。
目前,我已经实现了I线程计时器,它(每2秒)查看表是否有行并处理数据:
System.Threading.Timer checkTimer;
checkTimer = new System.Threading.Timer(Callback, null, 2000, 500);
private void InitSQLCon()
{
Con = new SqlConnection(ConectionString);
Con.Open();
}
private void Callback(Object state)
{
string queryString = "Select [Wi_Customer ID],[Wi_License_plate_ID] from " + Properties.Settings.Default.Table1 + " where Wi_Car_Rfid='" + s + "'";
SqlCommand command = new SqlCommand(queryString, Con);
SqlDataReader reader = command.ExecuteReader();
if (reader.HasRows)
{
///...make neccessary operations
}
}
我的问题是目前的实施并不有效。使用计时器检查表会消耗资源。我想以事件驱动的方式来做这件事。理想情况下,我希望实现add record to table1
引发的事件处理程序事件如果可能的话(因为我从来没有实现过事件处理程序),我会感谢任何关于如何做到这一点的反馈。
SQL Server中有一些更改跟踪功能,最值得注意的是通过SqlDependency
公开的-但是,坦率地说,我认为您最好考虑单独的通知机制。例如,我是redispub/sub的忠实粉丝,因为它的设置非常简单(见鬼,专用的pub/sub服务器甚至不需要持久性,所以让redis在windows上变得棘手的"bgsave"/"fork"问题不适用,所以你可以只使用nuget上可用的redis服务器)。然后,您只需要让您的工作人员订阅一个命名频道,系统的其他部分在添加工作时向该命名频道广播消息。简单高效。为了健壮性,您还希望定期手动轮询,但可能是在速度慢得多的轮询中,可能是每30秒左右。
以下是通过BookSleeve使用redis的pub/sub示例(您还需要在本地机器上运行redis服务器):
using System;
using System.Text;
using BookSleeve;
static class Program
{
static void Main()
{
// IMPORTANT: the "pub" and "sub" can be on entirely separate machines,
// as long as they are talking to the same server. They are only shown
// together here for convenience
using (var sub = new RedisSubscriberConnection("localhost"))
using (var pub = new RedisConnection("localhost"))
{
sub.Open();
pub.Open();
sub.Subscribe("busytime", (queue,payload) =>
{
// you don't actually need the payload, probably
var received = Encoding.UTF8.GetString(payload);
Console.WriteLine("Work to do! Look busy!: " + received);
});
string line;
Console.WriteLine("Enter messages to send, or q to quit");
while((line = Console.ReadLine()) != null && line != "q")
{
pub.Publish("busytime", line);
}
}
}
}