我正在创建一个多客户端命名管道服务器。客户端正确连接到服务器,但每当我尝试通过服务器或客户端写入管道时,代码都会挂起写入方法。是什么原因导致写入方法被卡住了?
服务器代码:
public void ListenForConnections()
{
Thread startListening = new Thread(AcceptConnections);
startListening.Start(PipeName);
}
public static void AcceptConnections(object ServerPipeName)
{
while (true)
{
try
{
NamedPipeServerStream pipeServer =
new NamedPipeServerStream(ServerPipeName.ToString(),
PipeDirection.InOut,
NamedPipeServerStream.MaxAllowedServerInstances,
PipeTransmissionMode.Message);
pipeServer.WaitForConnection();
pipeServer.ReadMode = PipeTransmissionMode.Message;
//A client has connected
Pipes.Add(pipeServer);
index++;
Thread Poll = new Thread(PollPipe);
Poll.Start(pipeServer);
}
catch (Exception ex)
{
return;
}
}
}
public static void PollPipe(Object Pipe)
{
byte[] bytes = new byte[1024];
NamedPipeServerStream PipeStream = (NamedPipeServerStream)Pipe;
MemoryStream ms = new MemoryStream();
do
{
ms.Write(bytes, 0, PipeStream.Read(bytes, 0, bytes.Length));
} while (!PipeStream.IsMessageComplete);
}
public void BroadcastObject(GlassSquidObject obj)
{
long length = 0;
byte[] bytes;
SoapFormatter formatter = new SoapFormatter();
using (MemoryStream ws = new MemoryStream())
{
formatter.Serialize(ws, obj);
length = ws.Length;
bytes = ws.GetBuffer();
}
for (int i = 0; i < Pipes.Count; i++)
{
Pipes[i].Write(bytes, 0, bytes.Length);
}
}
}
这是我客户的代码:
public bool ConnectToPipe()
{
if (String.IsNullOrWhiteSpace(PipeName))
return false;
PipeClient = new NamedPipeClientStream(Address, PipeName, PipeDirection.InOut);
try
{
PipeClient.Connect(5000);
Thread readThread = new Thread(PollPipe);
readThread.Start(PipeClient);
}
catch (Exception ex)
{
return false;
}
return true;
}
public bool WriteObject(GlassSquidObject obj)
{
long length = 0;
byte[] bytes;
try
{
SoapFormatter formatter = new SoapFormatter();
using (MemoryStream ws = new MemoryStream())
{
formatter.Serialize(ws, obj);
length = ws.Length;
bytes = ws.GetBuffer();
}
PipeClient.Write(bytes, 0, bytes.Length);
}
catch (Exception ex)
{
return false;
}
return true;
}
public static void PollPipe(Object Pipe)
{
byte[] bytes = new byte[1024];
NamedPipeClientStream PipeStream = (NamedPipeClientStream)Pipe;
PipeStream.ReadMode = PipeTransmissionMode.Message;
MemoryStream ms = new MemoryStream();
do
{
ms.Write(bytes, 0, PipeStream.Read(bytes, 0, bytes.Length));
} while (!PipeStream.IsMessageComplete);
}
答案 0 :(得分:5)
我仍然不确定写作是在等什么,但我找到了解决方案/解决方法来解决我的问题。通过将NamedPipe构造函数中的PipeOptions设置为Asynchronous,读取/写入成功完成!