在windowsservicec#.net中,当使用计时器事件完成时,作业未完成
本文关键字:事件 计时器 完成时 未完成 作业 windowsservicec# net | 更新日期: 2023-09-27 18:21:39
这里我写了一个窗口服务,它的工作是从一个文件夹中读取文件,并将相同的内容发送到数据库,然后将读取的文件发送到其他文件夹
现在我的服务已经设置了计时器事件,大约为10000意味着10秒,现在,如果一个处理100-1000之间的文件,在10秒内完成了处理良好输出的工作,如果在特定情况下处理6000-9000个文件,我的服务没有产生确切的输出,它无法在10000(10秒)内完成该工作,因此,我需要当服务处于作业中间时,它应该被中断,因为计时器已经完成,但在实际场景中,它应该完成特定的作业。
请提供一些建议,
可以工作的不同方法:
让计时器调用的方法可以安全地重新进入,然后不用担心。这往往很容易做到(完成的任务本质上是可重新进入的),也很棘手(如果它不是可自然进入的,你必须考虑多个线程对任务中每一件事的影响)。
在操作中有一个锁,所以来自不同定时器事件的不同线程只是相互等待。请注意,必须知道,一行中不会有几个任务的时间超过时间间隔,否则您将有一个不断增长的线程队列在等待它们的运行机会,而仅仅等待做某事所消耗的资源量也会随之增加。
不要将计时器设置为具有重复间隔,而是在每个任务结束时重新设置,这样下一个任务将在当前任务完成X秒后发生。
有一把锁,只有在你不需要封锁的情况下才能获得它。如果你必须阻止,那么当前任务仍在运行,我们只是让这个时间段过去,以避开它。
毕竟,10秒钟后还会有另一个计时器事件:
private static void TimerHandler(object state)
{
if(!Monitor.TryEnter(LockObject))
return;//last timer still running
try
{
//do useful stuff here.
}
finally
{
Monitor.Exit(LockObject);
}
}
使用一个名为IsProcessing的静态布尔变量。当您开始处理该文件时,您将其设置为true。当计时器被触发时,下一步检查文件是否仍在处理中。如果它仍在处理,什么也不做。