请考虑这个相当简单的情况。我有两个.NET 4.0 / C#控制台应用程序。我们将他们的名字称为“Launcher”和“SocketApp”。
Launcher除了在特定环境下启动SocketApp之外别无其他。它使用Process.Start()方法。 SocketApp运行一段时间,经过一段时间后,它的Main()循环退出并且进程终止。在Launcher再次启动之前,这个过程一直没有进行。 (在任何情况下都不会启动多个SocketApp实例)。循环就这样了。这样可以一次运行好几天。
但偶尔SocketApp无法启动。当Remoting通道尝试侦听套接字时,它会抛出异常。在内部远程处理代码深处抛出异常,在Bind()调用上是准确的。绑定调用失败的原因是因为套接字以某种方式从未在PREVIOUS成功运行的SocketApp上发布。我知道情况就是这样,因为如果我确保SocketApp关闭并且我做了一个netstat -n,我可以看到我想要Bind()的端口被绑定了。它处于永久的CLOSE_WAIT状态。它永远处于CLOSE_WAIT状态。
让Windows释放该套接字的唯一方法是关闭Launcher应用程序(这就是它变得奇怪的地方)。为什么这个世界会这样? Launcher在自己的进程中运行,根本不使用套接字。它的唯一目的是启动SocketApp。那么为什么Launcher的闭包会释放只有SocketApp使用的套接字呢?可能是因为我没有在Launcher的Process对象上调用Dispose()吗?这个故障很少出现,需要几天时间才能确定是否有任何特定修复有效。还有什么我应该看的吗?
德克斯特