C# 我必须在windows服务中实现Stop方法吗?

C# 我必须在windows服务中实现Stop方法吗?,c#,.net,windows-services,C#,.net,Windows Services,我正在看一些Windows服务形式的遗留代码 我注意到,在他们的OnStop()方法中,他们只是写入事件日志,但是没有对象清理或终止任何线程的控制。有两个后台线程是在服务启动时启动的,所以我想知道,这个服务真的停止了吗?如果是,线程是否正确关闭 停止方法是物理上终止进程,还是仅仅是一个逻辑停止,如果没有实现,实际上不会做任何事情?回答第一个问题,它终止进程。 但它必须实现清理代码,因为一个常见的场景是,您让线程在服务上运行,它会停止,但由于线程的原因,进程仍将在那里。我对left-thread也

我正在看一些Windows服务形式的遗留代码

我注意到,在他们的OnStop()方法中,他们只是写入事件日志,但是没有对象清理或终止任何线程的控制。有两个后台线程是在服务启动时启动的,所以我想知道,这个服务真的停止了吗?如果是,线程是否正确关闭


停止方法是物理上终止进程,还是仅仅是一个逻辑停止,如果没有实现,实际上不会做任何事情?

回答第一个问题,它终止进程。 但它必须实现清理代码,因为一个常见的场景是,您让线程在服务上运行,它会停止,但由于线程的原因,进程仍将在那里。我对left-thread也有同样的经验,因此我们应该实现线程清理代码和其他资源,以防止进程终止。

当服务停止时调用该方法。您可以在此处清除对象并停止线程等。如果您的线程在服务停止时不需要做任何特殊的事情,那么您可以保留OnStop方法

OnStop应在派生类中被重写。对于 要使服务有用,OnStart和OnStop都应该在中实现 你的服务课


停止服务与终止服务不是一回事。这是一个合乎逻辑的条件。管理员希望您在服务启动后停止执行任何操作。所以你的服务不会妨碍他下一步做什么。比如备份目录或编辑配置文件等等


您不必实际实现这一点。Windows也不强制执行,当您报告您已停止并且不阻止您执行任何操作时,服务管理器会相信您的话。当然,这可能会让管理员感到困惑。

我刚刚测试了它(请参阅我答案中的代码),当我有一个线程运行时,它毫无问题地终止了服务。我唯一一次遇到关于停止的问题是,如果您在
桌面上的
中有一个操作需要很长时间才能完成。您的post scott发生了什么事?我确实再次验证了您的代码服务是否会停止,但进程仍将运行。请停止服务并签入任务管理器。您将看到进程存在。如果线程具有阻止调用(如TcpListener侦听客户端),则会在不同的线程上调用OnStop。TcpListener线程如何阻止它?因此,OnStop将终止父线程和子线程,而不管子线程是否正在运行阻塞?当您的服务停止时(例如,从服务管理控制台停止)调用OnStop。