2013-04-30 18 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; 
     }      
    } 
}); 
相關問題