2011-02-11 111 views
0

我有一个Windows服务,无论用户何时向它发送一些数据,都会调用一些沉重的图像处理。因此,如果有多个数据,则数据将排队并按顺序处理。然而有时候处理数据可能会折腾,并且处理过程会永远停留在那里。还不确定为什么会发生。发生这种情况时,我希望自己重新启动服务器,以便在服务重新启动时从队列中取出下一个服务器。我的问题是重启服务本身是一个好主意吗?你甚至可以这样做,还是有其他方法可以做到这一点?本身重新启动Windows服务

Sapna的

+0

如果服务挂起,它应该如何重新启动? – Oded 2011-02-11 10:01:17

回答

0

如俄德在他的评论中说,如果服务已挂起,它不能重新启动。如果你能弄清楚它为什么会挂起并且完全停止它,那么最好,但是假设由于某种原因这是不可能的。

我能想到的两个选择是,如果图像处理是在一个线程中完成的,而且只有那个挂起的线程,那么你可能会有一个单独的“监视”线程,保持检查处理线程仍然很快乐,否则它会杀死它并重新启动它。或者,如果整个服务挂起,您可以有一个单独的监视服务,即检查和重新启动。

+0

嗯,是的..完成了。我使用超时检查服务是否处理卡住。这是在服务本身完成的。但是我希望在下一个数据被处理之前重新启动服务,以确保先前的处理错误不会破坏内存并影响下一次处理。因此,一旦我检测到处理已崩溃,在服务中使用Environment.Exit会是明智的吗?这是一项自动服务,所以它会在一分钟后自行重启?还有其他建议吗? – Sapna 2011-02-11 11:11:09

+0

@Sapna:如果我想做类似你说的话,那么我会创建一个控制处理的服务,并让该服务创建一个新的进程来完成实际的处理。这样,您可以让服务始终保持运行状态,而不必担心服务会挂起,并且服务可以轻松监视处理进程是否已退出(可能由于挂起而退出),并且可能只是启动另一个实例。像你所建议的那样让服务*退出*感觉不对。 – 2011-02-11 15:45:45

0

你有三个任务:

  1. 检测服务卡: 这可以用不同的方式来完成,第一个是使用超时
  2. 重新启动服务: 可以通过完成单独的监控服务,或者使用相同的服务不同的服务实例之间
  3. 手柄任务队列的另一个线程: 你需要你的任务队列序列化到磁盘,这样当重新启动服务能够继续处理队列