C#所有管道实例都很忙

时间:2013-08-26 06:35:39

标签: c# .net named-pipes

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

public OrderPrice DoAction()
{
  Task<OrderPrice> t = Task<OrderPrice>.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<object> parameters = (List<object>)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上运行。

1 个答案:

答案 0 :(得分:2)

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

Lock, mutex, semaphore... what's the difference?

就偶尔停止而言,可能是饥饿或僵局。

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

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