C#所有管道实例都很忙

以下代码创建一个新线程,首先作为命名管道客户端发送参数,然后作为服务器检索结果。 之后,它在另一个充当命名管道服务器的AppDomain中执行一个函数,之后作为客户端发回结果。

public OrderPrice DoAction() { Task t = Task.Factory.StartNew(NamedPipeClient, parameters); if (domain == null) { domain = AppDomain.CreateDomain(DOMAINNAME); } domain.DoCallBack(AppDomainCallback); return t.Result; } static OrderPrice NamedPipeClient(object parameters) { OrderPrice price = null; using (NamedPipeClientStream stream = new NamedPipeClientStream(PIPE_TO)) { stream.Connect(); SerializeToStream(stream, parameters); } using (NamedPipeServerStream stream = new NamedPipeServerStream(PIPE_BACK)) { stream.WaitForConnection(); price = (OrderPrice)DeserializeFromStream(stream); } return price; } void AppDomainCallback() { OrderPrice price = null; using (NamedPipeServerStream stream = new NamedPipeServerStream(PIPE_TO)) { stream.WaitForConnection(); List parameters = (List)DeserializeFromStream(stream); if (mi != null) price = (OrderPrice)mi.Invoke(action, parameters.ToArray()); } using (NamedPipeClientStream stream = new NamedPipeClientStream(PIPE_BACK)) { stream.Connect(); SerializeToStream(stream, price); } } 

代码每秒平均调用一次,并且工作时间超过7个小时。 但在某些时候“system.io.ioexception所有管道实例都很忙”被抛出,之后它们就不再重新连接了。 在这里浏览它似乎可能是因为没有正确处理管道对象,但我想这一切都很好,因为它们在内部使用语句。 有没有人知道这里有什么问题? 代码在.NET 4.0上运行,在Windows Server 2008上运行。

听起来它应该是一个mutex而不是一个简单的锁

锁,互斥,信号量…有什么区别?

只要偶尔停止,它可能是饥饿或僵局。

这是关于可能发生的事情的摘要的良好阅读材料

http://en.wikipedia.org/wiki/Dining_philosophers_problem