【发布时间】:2016-03-11 21:33:18
【问题描述】:
我试图通过搜索找到这个问题的答案,但我觉得我的措辞很糟糕,以获得不错的结果。
我有一个使用 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 中编辑的项目上。新项目正常处理。谁能给我解释一下这里发生了什么?
【问题讨论】:
-
我怀疑
SQLDataContext将修改后的对象保存在内存中 - 如果每次计时器经过时都创建一个新上下文会发生什么? -
@Damien_The_Unbeliever 原来如此,我什至没有想到。如果您将此添加为答案,我会在可用时对其进行标记。
标签: c# linq-to-sql windows-services