非同期で実行される再利用可能な名前付きパイプリスナーを作成する方法の良い例を見つけることができません。再利用可能なリスナーを作成できます。
NamedPipeServerStream pipeServer = new NamedPipeServerStream("MyPipe", PipeDirection.InOut);
while (true)
{
pipeServer.WaitForConnection();
StreamReader reader = new StreamReader(pipeServer);
MessageBox.Show(reader.ReadLine());
pipeServer.Disconnect();
}
非同期リスナーを作成できます。
NamedPipeServerStream pipeServer = new NamedPipeServerStream("MyPipe", PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous);
pipeServer.BeginWaitForConnection((a) =>
{
pipeServer.EndWaitForConnection(a);
StreamReader reader = new StreamReader(pipeServer);
MessageBox.Show(reader.ReadLine());
}, null);
しかし、私は両方をうまくやることができないようです。これの良い例はありますか?このような非同期通信の問題だと思うので、部分的に送信されたメッセージについても心配しています。
更新:私は少し近づいています。
pipeServer = new NamedPipeServerStream("MyPipe", PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous);
pipeServer.BeginWaitForConnection((a) =>
{
pipeServer.EndWaitForConnection(a);
StreamReader reader = new StreamReader(pipeServer);
while (running)
{
String text = reader.ReadLine();
if (String.IsNullOrEmpty(text) == false)
{
MessageBox.Show(text);
}
}
MessageBox.Show("Done!");
}, null);
これは1回正常に読み取られ、ループを継続します。ReadLineは、最初の正常な読み取りの後に空の空の文字列を返します。したがって、明らかにブロックされておらず、再度読み取ろうとしています。問題は、同じメッセージを2回送信しても受信されず、パイプライターがエラー2316を受信していると言っていることです(それが何を意味するのかはわかりませんが)。最初にリストしたコードサンプルのように、パイプが毎回クリーンアップされるのと同じようなことをする必要があると思いますが、まだそれが機能するようにはなりません。