![]() |
1
21
:OP没有指定重入是仅由计时器引起,还是服务是多线程的。假设是后者,但如果是前者,则如果计时器停止(自动重置或手动),则不需要锁定 |
![]() |
2
20
在这种情况下你不需要锁。在启动前设置timer.AutoReset=false。 之后 每项任务。 |
![]() |
3
8
在其他答案上的一个类似的变化,它允许计时器保持滴答声,并且只在可以获得锁时才进行工作,而不是停止计时器。 将其放入已用事件处理程序:
|
![]() |
4
7
快速检查它,看看服务是否正在运行。如果它正在运行,它将跳过此事件并等待下一个事件触发。
|
![]() |
5
4
我建议你在处理时不要让计时器滴答作响。 将计时器自动重置设置为false。从最后开始。以下是您可能感兴趣的完整答案 Needed: A Windows Service That Executes Jobs from a Job Queue in a DB; Wanted: Example Code |
![]() |
6
2
其他选项可能是使用BackGroundWorker类或ADPool.QueueUserWorkItem。 后台工作人员可以轻松地为您检查当前仍在进行的处理并一次处理1个项目的选项。ThreadPool将使您能够继续将项目的每一个记号(如果需要)排队到后台线程。 根据您的描述,我假设您正在检查数据库队列中的项目。在这种情况下,我将使用线程池将工作推到后台,而不是减慢/停止检查机制。 对于服务,我建议您考虑使用线程池方法 例如: 下面是一个应如何做到这一点的示例:
|
![]() |
7
2
有一个很好的方法可以通过反应式扩展来解决这个问题。下面是代码,您可以在这里阅读更完整的解释: http://www.zerobugbuild.com/?p=259
|
![]() |
8
0
另一种可能性是这样的:
|