有时,在某些机器上经常使用我的程序并且很少,正在使用我的程序的客户端正在获得“管道正在关闭”的例外情况。这发生在.WaitForConnection()上的NamedPipeServerStream上。之后,应用程序完全崩溃并释放Windows异常。当NamedPipeClientStream将信息传输到独立应用程序时会发生这种情况。
主要的Funktionality: 我写了几个与NamedPipes一起通信的工具(Office工具栏,一个服务,一个独立的.net应用程序和一个litle starter exe)。 该服务运行始终打开的NamedPipeServerStream(状态为.WaitForConnection();),并且独立应用程序也具有NamedPipeServerStream。 工具栏和starter .exe与服务进行通信。然后使用独立应用程序服务。
什么样的问题可以释放管道被关闭异常? 是否有可能服务器向独立应用程序发送信息,但由于独立应用程序尚未就绪或某些原因而将流关闭为早期?在每个NamedPipeClientStream上我执行waitforpipedrain如果pipeClient.IsConnected befor我关闭了pipeclient ..
感谢您的帮助
编辑:这是客户端流的示例
using (NamedPipeClientStream pipeClient =
new NamedPipeClientStream(".", pipename, PipeDirection.Out))
{
// Wait for a client to connect
try
{
pipeClient.Connect(3000);
// send params to the form
using (StreamWriter sw = new StreamWriter(pipeClient))
{
sw.AutoFlush = true;
sw.WriteLine(sendtext);
}
}
// Catch the IOException that is raised if the pipe is
// broken or disconnected.
catch (Exception e)
{
if (sid != "")
{
connections.Remove(conName);
}
eventLog1.WriteEntry("SendText Fehler 1 " + e.Message);
}
finally
{
if (pipeClient.IsConnected)
{
pipeClient.WaitForPipeDrain();
}
pipeClient.Close();
pipeClient.Dispose();
}
pipeserver(在seperad线程中运行)的示例
NamedPipeServerStream pipeServer;
PipeSecurity pipe_security = CreateSystemIoPipeSecurity();
do
string pipename = global::TOfficeCenter.Properties.Settings.Default.pipename;
string aText = "";
pipeServer = new NamedPipeServerStream(pipename, PipeDirection.In, ONE_INSTANCE, PipeTransmissionMode.Byte,
PipeOptions.None, IN_BUF_SIZE, OUT_BUF_SIZE, pipe_security);
try
{
// Verbindung zu TOfficeCenter.exe aufbauen
try
{
IsWaiting = true;
pipeServer.WaitForConnection();
IsWaiting = false;
using (StreamReader sr = new StreamReader(pipeServer))
{
string temp;
while ((temp = sr.ReadLine()) != null)
{
aText = aText + temp;
}
}
try
{
if (aText == "")
{
empfang(null);
}
else
{
if (aText != "KillPipe")
{ // XML empfangen
XmlDocumentTC xml = new XmlDocumentTC();
xml.LoadXml(aText);
empfang(xml);
}
}
}
catch (Exception)
{
empfang(null);
}
}
catch
{...........
}
}
catch (Exception e)
{...........
}
} while (running);
pipeServer.Close();
答案 0 :(得分:0)
有可能我终于找到了问题..
我发现在这段代码之后:
using (StreamWriter sw = new StreamWriter(pipeClient))
{
sw.AutoFlush = true;
sw.WriteLine(sendtext);
}
pipeClient.IsConnected();直接返回false,因此它永远不会出现在WaitForPipeDrain中。我现在这样做,并希望客户端在服务器完成阅读之前不关闭连接..
using (StreamWriter sw = new StreamWriter(pipeClient))
{
sw.AutoFlush = true;
sw.WriteLine(sendtext);
pipeClient.WaitForPipeDrain();
}
您认为可以解决问题吗?自从我这样做以来,我从未在两台测试机器上得到错误。但无论如何,错误很少发生..
答案 1 :(得分:0)
我的使用有点不同,但我会将服务器线程包括在内,因为它目前主要是从MSDN页面被黑客入侵:
http://codeception.com/docs/08-Customization
不确定我是否需要“WaitForPipeToDrain()”,但我从你的代码中取出它:)
我认为每次重置pipeServer都会清除我的IOException。
{{1}}