在windowsservicec#.net中,当使用计时器事件完成时,作业未完成

本文关键字:事件 计时器 完成时 未完成 作业 windowsservicec# net | 更新日期: 2023-09-27 18:21:39

这里我写了一个窗口服务,它的工作是从一个文件夹中读取文件,并将相同的内容发送到数据库,然后将读取的文件发送到其他文件夹

现在我的服务已经设置了计时器事件,大约为10000意味着10秒,现在,如果一个处理100-1000之间的文件,在10秒内完成了处理良好输出的工作,如果在特定情况下处理6000-9000个文件,我的服务没有产生确切的输出,它无法在10000(10秒)内完成该工作,因此,我需要当服务处于作业中间时,它应该被中断,因为计时器已经完成,但在实际场景中,它应该完成特定的作业。

请提供一些建议,

在windowsservicec#.net中,当使用计时器事件完成时,作业未完成

将不胜感激

可以工作的不同方法:

  1. 让计时器调用的方法可以安全地重新进入,然后不用担心。这往往很容易做到(完成的任务本质上是可重新进入的),也很棘手(如果它不是可自然进入的,你必须考虑多个线程对任务中每一件事的影响)。

  2. 在操作中有一个锁,所以来自不同定时器事件的不同线程只是相互等待。请注意,必须知道,一行中不会有几个任务的时间超过时间间隔,否则您将有一个不断增长的线程队列在等待它们的运行机会,而仅仅等待做某事所消耗的资源量也会随之增加。

  3. 不要将计时器设置为具有重复间隔,而是在每个任务结束时重新设置,这样下一个任务将在当前任务完成X秒后发生。

  4. 有一把锁,只有在你不需要封锁的情况下才能获得它。如果你必须阻止,那么当前任务仍在运行,我们只是让这个时间段过去,以避开它。

毕竟,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。当计时器被触发时,下一步检查文件是否仍在处理中。如果它仍在处理,什么也不做。