2013-04-30 20 views
0

我写了一些使用命名管道将字符串从一个应用程序发送到另一个应用程序的代码。它一次正常工作,但当客户端尝试第二次发送到服务器应用程序时,它会在尝试连接到客户端时冻结。在向NamedPipeServerStream发送请求后命名管道应用程序被冻结

服务器代码是这样的:

static void StartServer() 
{ 
    Task.Factory.StartNew(() => 
    { 
     var server = new NamedPipeServerStream("MyPipe"); 
     server.WaitForConnection(); 
     StreamReader reader = new StreamReader(server); 

     while (true) 
     { 
     var line = reader.ReadLine(); 

     if (line != null) 
     { 
      System.Windows.Forms.MessageBox.Show("Data: : " + line); 
     } 
     } 
    }); 
} 

的客户端代码:

private void Test() 
{ 
    using (var client = new NamedPipeClientStream("MyPipe")) 
    { 
     client.Connect(); 
     StreamWriter writer = new StreamWriter(client); 

     writer.WriteLine("INCOMING:1234567"); 
     writer.Flush(); 
     client.Dispose(); 
    } 
} 

通过跟踪代码,我可以看到服务器代码回路连续的任何线被检查阅读但没有找到任何。当Test()方法被再次调用时,客户端挂在client.Connect()调用上。没有例外。

任何人都可以看到我要去哪里错了吗?

回答

1

您的服务器保持连接到用于发送第一个字符串的第一个管道实例。

但是,您的客户端每次测试后处置其管道实例,所以第二个测试创建并试图在新的管道实例连接,但服务器不再侦听,所以连接调用阻塞等待服务器。

您需要:

  1. 让你的服务器多线程,因此它继续在维修已连接实例监听;或
  2. 重构您的客户端以便它连接一次,然后重新使用该连接的实例。
+0

感谢您的答复,我会看到关于重新写它的第一种方式。 – GrandMasterFlush 2013-04-30 12:58:41

0

从什么@克里斯迪克森回答之后,我解决我的问题与下面的代码:

Task.Factory.StartNew(() => 
{ 
    var server = new NamedPipeServerStream("MyPipe", PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous); 

    StreamReader reader = new StreamReader(server);  
    Boolean connectedOrWaiting = false; 

    while (true) 
    { 

     if (!connectedOrWaiting) 
     { 
      server.BeginWaitForConnection((a) => { server.EndWaitForConnection(a); }, null);  
      connectedOrWaiting = true; 
     } 

     if (server.IsConnected) 
     { 
      var line = reader.ReadLine(); 

      if (line != null) 
       System.Windows.Forms.MessageBox.Show("Data: : " + line); 

      server.Disconnect();  
      connectedOrWaiting = false; 
     }      
    } 
}); 
相关问题