C# 所有管道实例都很忙

问题描述 投票:0回答:2

以下代码创建一个新线程,首先充当命名管道客户端来发送参数,然后充当服务器来检索结果。之后,它在另一个 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 所有管道实例都忙”,并且此后它们将不再重新连接。浏览这里似乎可能是因为没有正确处理管道对象,但我想这一切都很好,因为它们位于 using 语句中。 有谁知道这里可能出了什么问题吗?该代码位于 Windows Server 2008 上运行的 .NET 4.0 中。

c# .net named-pipes
2个回答
2
投票

听起来应该是一个

mutex
而不是一个简单的锁

锁、互斥量、信号量...有什么区别?

至于偶尔的停顿,可能是饥饿或僵局。

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

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


0
投票

您可能收到错误消息:“System.IO.IOException:所有管道实例都忙”的另一种情况是:

启动NamedPipeServerStream时,如果Pipe Name已被其他Server使用,则会抛出此错误。

© www.soinside.com 2019 - 2024. All rights reserved.