我试图通过搜索找到答案,但我觉得我的措辞很差,结果不错。
我有一个使用Linq-SQL的Windows服务。它应该每隔20秒从表中提取数据,处理数据,相应地更新行,然后冲洗并重复。
SQLDataContext sqlDB;
protected override void OnStart(string[] args)
{
ServiceLog1.WriteEntry("Service1 started");
sqlDB= new SQLDataContext ();
//Initalize and start Timer for service action
Timer timer = new Timer();
timer.Interval = 20000; // 20 seconds
timer.Elapsed += new ElapsedEventHandler(this.DoWork);
timer.Start();
}
public void DoWork(object sender, ElapsedEventArgs args)
{
List<Items> items= sqlDB.Items.Where(i=> i.Processed == false).Take(20).ToList();
if(items.Count > 0)
ServiceLog1.WriteEntry("Processing " + items.Count + " queue items.");
//work work...
//set items processed == true
//submit changes to DB
我的问题(我甚至不能100%确定这是一个问题)是这样的:
如果要运行三个未处理的测试项目,它会将它们全部更新为应该处理的。很容易测试WHAT IF场景,如果我要在SQL中将一个项目的处理值更改回false,则服务将创建一个事件日志条目,表示它正在处理一个项目,但该项目永远不会更新再次,将在每个循环中处理。
这似乎只发生在SQL编辑的项目中。新项目正常处理。任何人都可以向我解释这里发生了什么吗?
答案 0 :(得分:0)
正如Damien_The_Unbeliever在问题评论中指出的那样,我的问题与SQLDataContext在内存中保留对象有关。每次计时器结束时我都需要创建一个新的上下文。