以下代码创建一个新线程,首先作为命名管道客户端发送参数,然后作为服务器检索结果。之后,它在另一个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 all pipe instances are busy”发生并且它们无法再连接。在这里浏览似乎是因为没有正确处理管道对象的释放,但我认为这些都很好,因为它们在using语句中。有人知道问题出在哪里吗?该代码运行在.NET 4.0上,Windows Server 2008。