End Using ※二回目の名前付きパイプ Using pipeServer = New NamedPipeServerStream("PipeServer", PipeDirection.In, 1) を削除したのですが、 Await pipeServer.WaitForConnectionAsync()の部分で、 「閉じているパイプにアクセスできません」と出てしまうので、 やむを得ず、この形で行こうと思いました。 Using writer = New StreamWriter(pipeServer) 〜 End Using で、パイプも閉じてしまうのでしょうか?
まずOutで出力し、改めて新しいInの名前付きパイプで入力を受けたい場合、MyMethodが最後まで実行されてからInで作成する必要があります。 そうするためには、MyMethodを Async Function MyMethod() As Task としてTaskを返値に持たせ、呼び出し側で Await MyMethod() Using pipeServer = New NamedPipeServerStream("PipeServer", ... とMyMethodをAwaitするようにします。
名前付きパイプについての質問の続きです。
次のコードは、名前付きパイプのServer側からClient側にMessegeを送って、Client側から送り返されるMessegeを出力するものです。
(Client側のコードは省略)
このコードで、問題なく動作するのですが、一回目の名前付きパイプをMethod化するとIOExceptionエラー(多分?サーバーインスタンスの最大数を超えた)が発生します。
一回目のNamedPipeServerStreamが閉じていないので、インスタンス数が1では足りないということだと考え、インスタンス数を2にして実行すると、
UnauthorizedAccessExceptionエラー(パスへのアクセスが拒否されました)が発生します。メソッド化すると、うまく動かなく理由を教えて頂けないでしょうか?
宜しくお願い致します。
Private Async Sub FormServer_Load(sender As Object, e As EventArgs)
Handles Me.Load
※一回目の名前付きパイプ をMethod化して呼び出すとエラーになる
Using pipeServer = New NamedPipeServerStream("PipeServer",
PipeDirection.Out, 1)
Await pipeServer.WaitForConnectionAsync()
Using writer = New StreamWriter(pipeServer)
Dim message = $"PipeClient{1}"
Await writer.WriteLineAsync(message)
End Using
End Using
※二回目の名前付きパイプ
Using pipeServer = New NamedPipeServerStream("PipeServer",
PipeDirection.In, 1)
Await pipeServer.WaitForConnectionAsync()
Using reader = New StreamReader(pipeServer)
Dim message = Await reader.ReadLineAsync()
Debug.Print($"受信メッセージ : {message}
Client→Server{vbLf}")
End Using
End Using
End Sub
Async Sub MyMethod()
Using pipeServer = New NamedPipeServerStream("PipeServer",
PipeDirection.Out, 1)
Await pipeServer.WaitForConnectionAsync()
Using writer = New StreamWriter(pipeServer)
Dim message = $"PipeClient{1}"
Await writer.WriteLineAsync(message)
End Using
End Using
End Sub