2009-06-06 69 views
1

我有一個IPC問題。我創建成一個窗口服務NamedPipeServer:IPC windows服務窗體

serverPipe = new NamedPipeServerStream(Constants.PIPE_NAME, PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous); 
Thread thread = new Thread(new ThreadStart(pipeWork)); 
thread.Start(); 

,其中管道是

private static void pipeWork() 
{ 
    try 
    { 
     byte[] buffer = new byte[1024]; 
     while (true) 
     { 
      if (!serverPipe.IsConnected) 
       serverPipe.WaitForConnection(); 
      int nr = serverPipe.Read(buffer, 0, buffer.Length); 
      String str=Encoding.Default.GetString(buffer); 

     … 
     } 
    } 
    catch (Exception ex) 
    { 

    } 
} 

,併爲Windows窗體我有客戶

clientPipe = new NamedPipeClientStream(".", PhotoServiceClassLibrary.Constants.PIPE_NAME, PipeDirection.InOut,PipeOptions.Asynchronous); 
       clientPipe.Connect(); 
       clientPipe.ReadMode = PipeTransmissionMode.Message; 

pipeThread=new Thread(new ThreadStart(pipeWork)); 
      pipeThread.Start(); 

,其中管道是

private void pipeWork() 
{ 
    try 
    { 
     while (true) 
     { 
      using (StreamReader sr = new StreamReader(clientPipe)) 
      { 
       string message; 

       while ((message = sr.ReadLine()) != null) 
       { 

        … 

       } 
      } 
     } 
    } 
    catch (Exception ex) 
    { 

    } 
} 

I wan噸當服務開始動作以從窗戶形式禁用的ContextMenuStrip,對於該服務將消息寫入到一個StreamWriter SW:

 StreamWriter write = null; 
     write = new StreamWriter(serverPipe); 

     if (serverPipe.IsConnected) 
     { 
      write.Write(message); 
      write.Flush(); 
     } 

的代碼是正確的,因爲我測試它實現了另一個窗口的形式創建同樣的東西,如Windows服務和 窗口管道服務器之間的通信 - >窗體管道客戶端工作正常。 問題是,Windows窗體 - 客戶端管道沒有收到來自Windows服務 - 服務器管道的消息。

我知道WCF可以是一個更好的主意,但我想了解爲什麼不在低級IPC工作。爲什麼?我看到一個非常奇怪的行爲。我的服務與Windows窗體交互2次: 1.我的服務專爲下載一些照片而設計。當他開始下載時,他會發送一條消息給windows窗體來宣佈他。 2.當我停止服務時,他發送消息給窗體窗體,他也停下來。 我剛剛發現這兩條消息都是在服務停止後纔到達windows代理的。有人能解釋爲什麼嗎?

回答

1

我希望這不是你真正的代碼。在ThreadStart處理程序的代碼周圍有try/catch塊是很好的(否則一個異常就會悄悄地刪除該線程)。但是,如果你沒有在catch塊中記錄異常,那麼它確實同樣糟糕。

你有一個謎(服務器沒有收到消息),你隱藏信息(發生異常)。如果你沒有隱藏信息,你可能會爲你的祕密找到答案(服務器沒有收到消息,因爲發生了異常)。

+0

沒有,是不是我真正的代碼。我的真實代碼是: 嘗試{ [...] } catch(例外ex) { throw ex; } – user61652 2009-06-06 21:45:17