我有两个与管道通信的不同应用程序。大多数请求都可以正常工作,但在尝试通过管道发送字符串时,我会不时遇到异常:
System.InvalidOperationException : Pipe hasn't been connected yet.
使用以下堆栈:
at System.IO.Pipes.PipeStream.CheckWriteOperations()
at System.IO.Pipes.PipeStream.Flush()
at System.IO.StreamWriter.Flush(Boolean flushStream, Boolean flushEncoder)
at System.IO.StreamWriter.Dispose(Boolean disposing)
at System.IO.TextWriter.Dispose()
最后一行指向客户端管道代码中的行,我用“>”
标记 using (var pipeClient =
new NamedPipeClientStream("PipeName"))
{
try
{
using (var streamWriter = new StreamWriter(pipeClient))
{
pipeClient.Connect(20000);
streamWriter.AutoFlush = true;
streamWriter.WriteLine(dataToSend);
pipeClient.WaitForPipeDrain();
>}
}
catch (Exception x)
{
Log.Error("ExceptionText");
}
}
在服务器上,这就是管道的处理方式:
using (var streamReader = new StreamReader(pipeServer))
{
pipeServer.WaitForConnection();
string data;
while ((data = streamReader.ReadLine()) != null)
{
//Process the data here...
}
pipeServer.Disconnect();
}
根据MSDN,PipeStream.Flush()
甚至不应该做任何事情,但它会以某种方式失败?我对整个情况感到困惑。
这一切意味着什么?它是否试图处理在某种程度上断开连接的管道? 如果是,我该怎么办呢?
或者我做错了什么?
修改:
根据{{3}},在PipeStream.Flush()
期间检查管道状态。如果状态恰好是WaitingToConnect
,则返回我正在获得的异常。
但这怎么可能发生?如果pipeClient.Connect(20000);
没有例外,则状态必须不同,无论是Connected
,Broken
还是其他。