2011-03-16 185 views
1

请考虑这个相当简单的场景。我有两个.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()?这个小故障似乎很少,以至于需要几天来确定是否有任何特定的修复方法是有效的。还有什么我应该看的?

德克斯特

+0

我敢打赌一个国王里斯的花生酱杯,问题是你没有从发射器调用Dispose(),因为你问了,但我没有足够的信心把它作为答案。考虑到垃圾收集的工作原理,它对我来说是最感冒的。 – David 2011-03-16 16:20:20

+0

我已经添加了Dispose()调用。我会在几天内知道它是否有效。除此之外:我对这个网站不太熟悉。 “评论”和“答案”有什么区别? – 2011-03-16 16:26:56

+0

评论upvotes不会被添加到声誉。评论是针对问题和答案的边对话。有时候,如果人们没有明确的答案,他们会发表评论。 – 2011-03-16 16:28:30

回答

0

它实际上是在操作系统中释放端口在这一点上的手。该端口将在4 minutes by default in Windows中使用。以下是unix的参考。

+0

是的,理性的人会这么认为。我已经在整个网络上看到了4分钟的超时提示,但不幸的是,这并不是什么情况。它永远保持在CLOSE_WAIT中......直到我关闭LauncherApp。 :( – 2011-03-16 16:25:11

+0

听起来像你缺少Dispose调用。在使用语句中包装套接字用法http://msdn.microsoft.com/en-us/library/yh598w02.aspx – 2011-03-16 16:33:05