非同期の NamedPipeServerStream の適切で明確な例を見つけようとしていましたが、私に適したものを見つけることができませんでした。
クライアントからのメッセージを非同期的に受け入れる NamedPipe サーバーが必要です。クライアントはシンプルで、私にとっては問題ありません。しかし、サーバーの例が見つからないか、それがどのように機能するかを理解できません。
私が理解しているように、 NamedPipeServerStream オブジェクトを作成する必要があります。これをやろう:
namedPipeServerStream = new NamedPipeServerStream(PIPENAME, PipeDirection.In, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous, BUFFERSIZE, BUFFERSIZE);
うまくいくようです。しかし、PipeSecurity または PipeAccessRule をまったく使用する必要があるかどうかはわかりません。私は?私のサーバーは、ローカル システムで Windows サービスとして動作します。
次は何?非同期接続には BeginWaitForConnection を使用する必要があると考えています。どれどれ:
namedPipeServerStream.BeginWaitForConnection(WaitForConnectionAsyncCallback, <some strange thing>);
質問 1 : この「奇妙なもの」とは何ですか? それの使い方?
質問 2 : やるべきですか
while(true)
{
namedPipeServerStream.BeginWaitForConnection(WaitForConnectionAsyncCallback, <some strange thing>);
}
サーバーが常に接続を待機するようにするには? それとも、他の方法でそれを行う必要がありますか?
そして... WaitForConnectionAsyncCallback 関数を見てみましょう:
private void WaitForConnectionAsyncCallback(IAsyncResult result)
{
Console.WriteLine("Client connected.");
byte[] buff = new byte[BUFFERSIZE];
namedPipeServerStream.Read(buff, 0, namedPipeServerStream.InBufferSize);
string recStr = General.Iso88591Encoding.GetString(buff, 0, namedPipeServerStream.InBufferSize);
Console.WriteLine(" " + recStr);
namedPipeServerStream.EndWaitForConnection(result);
}
..これはもちろん機能しません。ストリームから文字列を正確に受け取る方法がわからないためです。どのように?InvalidOperationException が発生するようになりました。
パイプはまだ接続されていません。
では、NamedPipeServerStream を使用して非同期作業を整理するにはどうすればよいでしょうか?