命名管道服务器在没有警告的情况下退出
Named Pipes Server exits without warning
我正在尝试在服务器软件和客户端之间设置命名管道连接。
这是我的服务器代码:
class Program
{
private static NamedPipeServerStream server = new NamedPipeServerStream("p", PipeDirection.InOut);
static void Main(string[] args)
{
Action<NamedPipeServerStream> a = callBack;
a.BeginInvoke(server, ar => { }, null);
}
private static void callBack(NamedPipeServerStream pipe)
{
pipe.WaitForConnection();
var line = "";
while (line != "exit")
{
try
{
StreamReader reader = new StreamReader(pipe);
while (line != "exit")
{
line = reader.ReadLine();
switch (line)
{
default:
foo();
break;
}
}
break;
}
catch (IOException)
{
pipe.Disconnect();
continue;
}
}
}
}
但是当我尝试运行这个应用程序时,它在启动后直接退出。
我已经使用调试器到达 WaitForConnection
行,然后它退出,没有错误或异常。 运行ning 除了服务器什么也没有。
它在未被捕获部分处理的情况下退出。我错过了什么吗?
执行在 WaitForConnection 上被阻止,直到 NamedPipeClientStream 对象与 NamedPipeServerStream 对象建立连接后才会继续。
请看这里(示例应该对您有所帮助):https://msdn.microsoft.com/en-us/library/system.io.pipes.namedpipeclientstream(v=vs.110).aspx
编辑:我误解了这个问题,最初认为这个问题与 WaitForConnection 方法的执行阻塞有关。下面的代码是对实际问题的补充以及我的解释。
问题在于您调用操作的方式。当您调用 BeginInvoke 时,它是在线程池线程上异步调用的。因此,您需要检查操作是否已完成,否则主线程将保持 运行 并到达终点。我已经更新了关于如何轻松做到这一点的答案
希望这段代码能帮助您理解它存在的原因! :)
Action<NamedPipeServerStream> a = callBack;
var result = a.BeginInvoke(server,ar => { },null);
while (!result.IsCompleted)
{
}
我正在尝试在服务器软件和客户端之间设置命名管道连接。
这是我的服务器代码:
class Program
{
private static NamedPipeServerStream server = new NamedPipeServerStream("p", PipeDirection.InOut);
static void Main(string[] args)
{
Action<NamedPipeServerStream> a = callBack;
a.BeginInvoke(server, ar => { }, null);
}
private static void callBack(NamedPipeServerStream pipe)
{
pipe.WaitForConnection();
var line = "";
while (line != "exit")
{
try
{
StreamReader reader = new StreamReader(pipe);
while (line != "exit")
{
line = reader.ReadLine();
switch (line)
{
default:
foo();
break;
}
}
break;
}
catch (IOException)
{
pipe.Disconnect();
continue;
}
}
}
}
但是当我尝试运行这个应用程序时,它在启动后直接退出。
我已经使用调试器到达 WaitForConnection
行,然后它退出,没有错误或异常。 运行ning 除了服务器什么也没有。
它在未被捕获部分处理的情况下退出。我错过了什么吗?
执行在 WaitForConnection 上被阻止,直到 NamedPipeClientStream 对象与 NamedPipeServerStream 对象建立连接后才会继续。
请看这里(示例应该对您有所帮助):https://msdn.microsoft.com/en-us/library/system.io.pipes.namedpipeclientstream(v=vs.110).aspx
编辑:我误解了这个问题,最初认为这个问题与 WaitForConnection 方法的执行阻塞有关。下面的代码是对实际问题的补充以及我的解释。
问题在于您调用操作的方式。当您调用 BeginInvoke 时,它是在线程池线程上异步调用的。因此,您需要检查操作是否已完成,否则主线程将保持 运行 并到达终点。我已经更新了关于如何轻松做到这一点的答案
希望这段代码能帮助您理解它存在的原因! :)
Action<NamedPipeServerStream> a = callBack;
var result = a.BeginInvoke(server,ar => { },null);
while (!result.IsCompleted)
{
}