【发布时间】:2011-04-25 16:57:15
【问题描述】:
我在我的 Windows 服务中使用System.Threading.Timer 并使用Monitor.TryEnter 锁定回调方法,因此它是不可重入的。在回调内部,我正在循环一些数据库对象(Linq to SQL 实体)并执行一些 IO 任务。在循环的每次迭代中,我都会更改实体的一些属性以将其标记为已处理。循环退出后,我在 datacontext 上调用 SubmitChanges,它将更改持久化到数据库中。出现如下问题:如果在执行回调的时候服务停止了,可能有一些IO任务已经执行了,但是数据库中的记录还没有被标记为已处理(即SubmitChanges还没有被调用)--显然,不是我想要发生的事情。不知何故,我需要与 OnStop 事件已触发的回调工作线程进行通信,以允许它提交更改并完成处理。如何最好地做到这一点?
【问题讨论】:
-
我认为您担心的是,通过终止计时器,您将终止计时器回调函数的执行,对吗?
-
不完全。我应该更清楚;我意识到停止计时器只会阻止它再次触发,但不会终止回调方法。但是,一些 IO 任务可能需要长时间运行——可能需要几分钟。如果花费太长时间,我不希望用户(或系统)强行中止该过程。我宁愿它自己优雅地完成它的服务。
-
嗯,服务控制有 RequestMoreTime() 方法或类似的方法(我是从记忆中说的),您可以使用它来延长服务停止时间,但似乎仍然不会被 SCM 挂起。跨度>
标签: .net windows-services timer threadpool