2009-06-06 7 views
1

IPCの問題があります。IPCウィンドウのサービスウィンドウフォーム

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) 
    { 

    } 
} 

と私はクライアントに配管が

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

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

        … 

       } 
      } 
     } 
    } 
    catch (Exception ex) 
    { 

    } 
} 
ある

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(); 

を持つWindowsフォームにある

:私は、WindowsサービスNamedPipeServerに作成されました

I wan私が実装する別のWindowsフォームをテストするために作成したので

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

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

コードが正しい:Tサービスは、サービスはのStreamWriterのSWにメッセージを書き込むために、WindowsフォームからいるContextMenuStripを無効にするには、アクションを開始するときWindowsサービスと同じようなものは、 windowsフォームパイプサーバー - > windowsフォームパイプクライアント間の通信はうまくいきます。 問題は、Windowsフォーム - クライアントパイプがWindowsサービス - サーバーパイプからメッセージを受信しないことです。

私はWCFが良いアイデアになることは知っていますが、なぜ低レベルのIPCで動作していないのか理解したいと思います。どうして?私は非常に奇妙な行動を見た。私のサービスはWindowsフォームと2回対話します。 1.私のサービスはいくつかの写真をダウンロードするように設計されています。彼はダウンロードを開始すると、彼はそれを発表するためにWindowsのフォームにメッセージを送信します。 2.私はサービスを停止すると、彼はWindowsフォームにメッセージを送信し、彼はまた停止します。 私は、両方のメッセージがサービスが停止した後にのみWindowsエージェントに到着することを発見しました。なぜ誰かが説明できますか?

答えて

1

これはあなたの実際のコードではないと思います。あなたがThreadStartハンドラのコードの周りにtry/catchブロックを持っているのは良いことです(そうしないと、スレッドは静かにスレッドを削除します)。しかし、catchブロックで例外をログに記録していない場合は、それは本当に悪いことです。

あなたは謎を持っています(サーバーはメッセージを受信しません)、あなたは情報を隠しています(例外が発生しています)。情報を隠していない場合は、謎の解答があるかもしれません(例外が発生したため、サーバーはメッセージを受信しません)。

+0

いや、私の実際のコードではありません。私の実際のコードは です。{ [...] } catch(例外ex) { throw ex; } – user61652

+0

と、いいえ、私は何のエラーもありません...私はWindowsサービスとは何をしなければならないshoulは、namedpipeを介してWindowsフォームと通信??? – user61652

+0

例外をもう一度スローする場合は、「throw;」を実行します。 「投げてはいけない」。あなたがただそれを転覆させようとしているならば、それを捕まえないでください。ベスト、それをキャッチし、それを記録する。 –

0

私は同じことを実装しようとしています。

NamedPipeServerStream(serverPipe)コンストラクタでPipeTransmissionMode.Message列挙型を渡していることに気づきました。つまり、ストリームに文字列が含まれます。

しかしpipeWorkでは、それらをバイト配列として読み込んでいます。 MSDNのこの記事の例では

ルック: http://msdn.microsoft.com/en-us/library/system.io.pipes.namedpipeclientstream.aspx