DOBON.NETプログラミング道掲示板
(現在 過去ログ5 を表示中)

[ 最新記事及び返信フォームをトピックトップへ ]

■34983 / inTopicNo.1)  Usingの使い方が間違っている?
  
□投稿者/ かけ出しVB 一般人(2回)-(2021/12/21(Tue) 10:41:45)
  • アイコン環境/言語:[VisualBasic Windows10 ] 
    分類:[.NET] 

    名前付きパイプについての質問の続きです。
    次のコードは、名前付きパイプの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
    

引用返信 削除キー/
■34984 / inTopicNo.2)  Re[1]: Usingの使い方が間違っている?
□投稿者/ Hongliang 大御所(614回)-(2021/12/21(Tue) 11:08:02)
  • アイコン2021/12/21(Tue) 11:21:14 編集(投稿者)

    MyMethodは完了しないうちに制御を返してくるので、1つ目のPipeServerがオープンされたまま2つ目のPipeServerをオープンしようとします。
    そのときPipeDirectionが既存のものと違うものが指定されたため、アクセス拒否になります。
    (つまり、PipeDirectionは同時に開いている同名のNamedPipeServerStreamすべてで同じである必要があります)

    まず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を出力するものです。
    NamedPipeServerStreamをInとOutそれぞれ作って2回接続するのではなくて、InOutで1つ作って、1回接続してWrite/Readしたほうが簡単じゃないでしょうか…。
引用返信 削除キー/
■34985 / inTopicNo.3)  Re[2]: Usingの使い方が間違っている?
□投稿者/ かけ出しVB 一般人(3回)-(2021/12/21(Tue) 13:32:01)
  • アイコンお返事ありがとうございます。
    MyMethodは完了しないうちに制御を返してくるので、・・・
    について、深堀り勉強してみます。
    どのようにすれば良いかは、分かりました。
    InOutでやろうとして、単純に真ん中の

    End Using
    ※二回目の名前付きパイプ
    Using pipeServer = New NamedPipeServerStream("PipeServer",
    PipeDirection.In, 1)
    を削除したのですが、
    Await pipeServer.WaitForConnectionAsync()の部分で、
    「閉じているパイプにアクセスできません」と出てしまうので、
    やむを得ず、この形で行こうと思いました。
    Using writer = New StreamWriter(pipeServer)
     〜
    End Using
    で、パイプも閉じてしまうのでしょうか?
引用返信 削除キー/
■34986 / inTopicNo.4)  Re[3]: Usingの使い方が間違っている?
□投稿者/ Hongliang 大御所(615回)-(2021/12/21(Tue) 13:47:58)
  • アイコン> Using writer = New StreamWriter(pipeServer)
    >  〜
    > End Using
    > で、パイプも閉じてしまうのでしょうか?

    はい。
    https://docs.microsoft.com/ja-jp/dotnet/api/system.io.streamwriter.-ctor?view=net-6.0#System_IO_StreamWriter__ctor_System_String_System_Boolean_
    そうさせないためには、StreamWriterコンストラクタの第4引数を指定する必要があります。
    あるいは、StreamWriterをUsingしないという選択肢もあります。その場合、書き込んだ後はFlush()だけして、Dispose()やClose()はしないでおきます。
引用返信 削除キー/
■34987 / inTopicNo.5)  Re[4]: Usingの使い方が間違っている?
□投稿者/ かけ出しVB 一般人(4回)-(2021/12/21(Tue) 14:48:24)
  • アイコン全ての謎が解けた・・って感じです。
    感謝の限りです。
    教えて頂いたページは、何度も何度も読んだつもりですが、肝心なところを読み解いていない、いわゆる猫に小判ってやつですね?
    恥ずかしいです。
    今後は、着目点を変えて、勉強をしようと思いました。
    ありがとうございました。

解決み!
引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Mode/  Pass/


- Child Tree -