我在.NET 3.5中实现了一个小型的WCF服务,客户端通过TCP在4321号端口连接该服务。该服务可以通过System.Diagnostics.Process派生其他进程。当然,当服务被杀死、崩溃或其他情况时,生成的进程将会继续运行。我遇到的问题是,如果我尝试在这些进程仍在运行时重新启动服务,我会得到以下异常:
CommunicationException: IP端点0.0.0.0:4321上已经有一个侦听器。请确保您没有在应用程序中多次使用此端点,并且没有其他应用程序正在侦听此端点。
事实上,当我运行netstat时,可以看到有一个进程正在监听TCP 4321端口:
TCP 0.0.0.0:4321 MTL-WKS-AG196:0 LISTENING 97308
这里看到的进程ID(97308)是我最初启动的服务的进程ID(它不应该再存在,因为它已被杀死)。唯一释放该端口的方法是杀死服务期间生成的所有进程。
我对端口和进程知之甚少,但我的理解是子进程“继承”父进程所监听的端口。这是否与实际情况相符?
有没有一种方法可以取消这种行为?而不需要访问生成进程的代码?
此外,我认为这似乎不可能,但是否有办法告诉Windows在父进程被杀死时终止子进程?
谢谢!