请考虑这个相当简单的场景。我有两个.NET 4.0/C#控制台应用程序。我们称他们的名字为“Launcher”和“SocketApp”。.NET Remoting套接字不会死亡,即使在进程之后
启动器只会在特定情况下启动SocketApp。它使用Process.Start()方法完成。 SocketApp运行一段时间后,它的Main()循环退出并且进程终止。这个过程一直持续到Launcher再次启动。 (在任何情况下都不会启动SocketApp的多个实例)。周期如此。这一次运行良好。
但偶尔SocketApp将无法启动。它在远程处理通道试图侦听套接字时引发异常。这个异常在内部的Remoting代码的深处被抛出,在Bind()调用中是精确的。绑定调用失败的原因是因为套接字从未在以前成功运行的SocketApp上发布。我知道这是事实,因为如果我确保SocketApp已关闭,并且执行了netstat -n,我可以看到我要绑定()的端口被绑定。它处于永久CLOSE_WAIT状态。它只是永远处于CLOSE_WAIT状态。
让Windows释放该套接字的唯一方法是(这是它变得很奇怪)关闭Launcher应用程序。为什么在这个世界上会这样呢?启动程序在自己的进程中运行,根本不使用套接字。唯一的目的是启动SocketApp。那么为什么启动器的封闭释放只有SocketApp使用的套接字呢?难道是因为我没有从Launcher的Process对象上调用Dispose()?这个小故障似乎很少,以至于需要几天来确定是否有任何特定的修复方法是有效的。还有什么我应该看的?
德克斯特
我敢打赌一个国王里斯的花生酱杯,问题是你没有从发射器调用Dispose(),因为你问了,但我没有足够的信心把它作为答案。考虑到垃圾收集的工作原理,它对我来说是最感冒的。 – David 2011-03-16 16:20:20
我已经添加了Dispose()调用。我会在几天内知道它是否有效。除此之外:我对这个网站不太熟悉。 “评论”和“答案”有什么区别? – 2011-03-16 16:26:56
评论upvotes不会被添加到声誉。评论是针对问题和答案的边对话。有时候,如果人们没有明确的答案,他们会发表评论。 – 2011-03-16 16:28:30