DOBON.NETプログラミング道掲示板

■ 「新規作成」から投稿できます。
■ マルチポストされた投稿を見つけたときは、その投稿に返信することによりご報告ください。その際は匿名で投稿し、マルチポストされている場所を併記してください。
■ スパム対策のため、メールアドレスの先頭に"_"という文字が付加されています。
RSS 2.0 RSS 2.0 | RSS 0.91 | 携帯電話用 | 自分専用のアイコンを使用するには | 掲示板への要望 | 管理人に連絡 | お気楽掲示板
■ 24時間以内に作成されたスレッドは New で表示されます。
■ 24時間以内に更新されたスレッドは UpDate で表示されます。

記事リスト ( )内の数字はレス数
NomalTaskの入れ子の待ち方2(4) | NomalTaskの入れ子の待ち方(5) | NomalVisualStudio2019 以降の検索ダイアログが正常に動作しない(1) | NomalUsingの使い方が間違っている?(4) | Nomal//./の意味は?(2) | Nomalバイナリーファイルの結合と分解(2) | NomalVSTOとWebView2の共存って可能?(1) | Nomal表の最後の行の下にDropできない(1) | NomalCookieの勉強を始めました。(2) | NomalDataGridViewの特定セルにボタンを配置する方法(3) | NomalDataGridViewのセル結合部分にボタンを表示する方法(3) | Nomal複数のPageに分かれる場合のスクレ―ピング(6) | NomalTask.Runの使い方(4) | NomalPictureBox のサイズを設定する(2) | NomalProcessクラスMainModuleプロパティでアクセス拒否(3) | NomalLINQでControlsをEnable=Falseに設定(3) | Nomalランダムファイルを高速化させたい(5) | Nomalプロセス間の通信(相互)(2) | NomalC#をVBに変換する方法が分かりません(1) | NomalPictureBoxに動的に画像を表示する(1) | NomalYahooのHPで、検索文字の入力ができない(3) | NomalWebView2のEncodeの問題?(5) | NomalWinFormでChromeをSeleriumで操作しているが、Closeの仕方(2) | Nomal印刷部数の固定(1) | NomalWinformでのDataGridView Comboboxのデータ追加削除が出来ない(3) | Nomalプログラムについて。(2) | Nomal拡張子関連付けのサンプルで削除時 例外発生(1) | Nomalユーザーコントロールをフォームで使用した時のエラー(6) | NomalマルチページTIFFをSelectActiveFrameでページ指定するとエラーが発生する(12) | Nomal画像の大きさを取得するには(4) | Nomalファイルがドライブ内で占有する容量(3) | NomalC#FormのXボタンイベントで、e.Cancel が使えない(2) | NomalAxWindowsMediaPlayerでプレイリストの途中から再生するには(2) | NomalWebView2でJavaScriptの実行の終了イベント(4) | NomalDataTableのDataRowVersion毎のInt型値の比較がうまくいかない(5) | NomalGPTかMBRを判断したい(2) | Nomalアセンブリ言語について。(1) | Nomalマクロについて。(3) | NomalDLL内のスレッドからイベントを発行すると、受信したフォームでラベルが更新できない(3) | Nomalアセンブリ言語について。(20) | Nomalシステムコールについて。(2) | Nomal Parallel.Forで思ったより早くならない(5) | NomalAngleSharp.Scripting.JavaScriptの使い方(2) | NomalDataAdapterで2回目のUpDateが出来ない(6) | NomalForm1イベントの選択が出来なくなりました。(9) | Nomalデザーナー時の継承先formのサイズ(0) | Nomalコンソールではなくテキストボックスに文字列を出力したい(7) | NomalAngleSharpのクエリー文2(4) | Nomalコーディングについて。(3) | Nomaldll修正時、それを参照しているexeのリビルド要否(2) | NomalAngleSharpのクエリー文(2) | Nomalデフォルトプロパティを使いたい(6) | Nomalテキストボックスでの制御(7) | NomalUSBカメラをピクチャボックスに表示(3) | Nomal二次元配列内の文字の置き換え(3) | Nomalcolor型を引数にする方法(2) | NomalVSプロジェクト作成方法の違いによる、プラグイン機能を持つアプリケーションへの影響について(6) | NomalInputボタンが押せない(4) | NomalWebBrowserのDocumentCompletedイベントの切り替え(3) | NomalEndConnectでのエラー(2) | Nomalボタンクリック時のLeaveイベントについて(1) | Nomalエクセルのデータを配列に読込んだ時の配列要素番号について(2) | Nomalorder by で抽出したデータをDataTableに入れてForEachでDataRow取得した際の順番(2) | Nomal非同期プログラミング時のConsole.WriteLineの動作(4) | NomalC#からストアドにDecimalを渡すと値が丸められる(4) | Nomalインスタンスの型を文字列で指定したい(2) | NomalSendKeys.Sendが効いていない(2) | Nomal他のプロジェクトのコントロールがツールボックスに表示されない(3) | Nomal複数のテキストボックス間のTextChangedイベントが相互干渉しないようにしたい(9) | Nomal呼び出し元によってWebApi側の処理速度に差が出る(1) | NomalPanelのDock=Topだとうまくいかない。代替案。(2) | Nomal.NetでのIPv6の比較(5) | Nomal.Net 5.0 におけるDLL参照問題?(7) | Nomal追加コントロールのtabindex値を既存の間に設定する方法(1) | NomalVB.net非同期処理でtextboxに出力したい(2) | NomalToolStripStatusLabelの空白部分を埋めたい(2) | NomalOracle への OleDb 接続に失敗する(3) | Nomal正規表現で株価を取得したい(1) | NomalVB.NETで作成したDLLをVB6.0から呼び出す(3) | Nomalデザイナで編集・チェックアウトキャンセルすると(3) | Nomal親スレッドへ処理の移譲(7) | NomalクラスによるGetBytes関数のエンディアンの違い(2) | Nomal[VB.NET]Excelのプロセスが終了しない(2) | NomalC#をVBに変換した際の強制的な参照渡し(2) | Nomal.Net 5.0 におけるServiceControllerの代替クラス(3) | Nomalリッチテキストボックスの文字を太文字にしたい(2) | Nomal新たにshowしたフォームでのボタンのクリック(5) | NomalVB.netにおける固定長出力方法(3) | NomalDataObjectの使いまわし(5) | NomalVB.NETからRDゲートウェイを利用したリモートデスクトップ接続(4) | NomalLIstview のDataSource(2) | NomalClassの作り方(2) | NomalVB.NETのVBA化(2) | NomalOpenFileDialogの初期ファイル名の表示が変(1) | NomalStopwatchクラスのElapsedMillisecondsの挙動(2) | NomalGoogle翻訳の結果の取得(2) | Nomal.net Chartで二重ドーナツグラフの作り方(3) | Nomal改行のコード(7) | Nomalexeをショートカットから起動した場合のエラー(2) | Nomalデスクトップ と Desktop(6) |



■記事リスト / ▼下のスレッド
■34997 / 親記事)  Taskの入れ子の待ち方2
□投稿者/ Wan 付き人(56回)-(2022/01/06(Thu) 17:05:10)
  • アイコン環境/言語:[VisualBasic2019 Windows10 Basic Framework4.7.2] 
    分類:[.NET] 

    「Taskの入れ子の待ち方」の続きです。
    子Taskをラムダ式からメソッドへのデリゲートに変え、Task.Runにキャンセルトークンを渡すように変更したコードが次の通りです。
    Dim tokenSource As New CancellationTokenSource
    Private Async Sub Button6_Click(sender As Object, e As EventArgs)
    tokenSource = New CancellationTokenSource
        Debug.Print($"StartTask ID:{CurrentId} スレッド:{CurrentThread.ManagedThreadId}")
        Try
          Await Task.Run(AddressOf Test, tokenSource.Token)
        Finally
          tokenSource.Dispose()
        End Try
        Debug.Print($"FinishTask ID:{CurrentId} スレッド:{CurrentThread.ManagedThreadId}")
    End Sub
    
    Async Function Test() As Task
    Dim i As Integer = 0
        Debug.Print($"子Task ID:{CurrentId} スレッド:{CurrentThread.ManagedThreadId}")
        Dim 孫Task As Task = Task.Run(
          Sub()
              Dim j As Integer = 0
                Debug.Print($"孫子Task ID:{CurrentId} スレッド:{CurrentThread.ManagedThreadId}")
                While j < 7
                  If token.IsCancellationRequested Then
                      Debug.Print("孫Taskは、停止しました。")
                        Exit While
                    End If
                    Thread.Sleep(500) '0.5秒待つ
                    Debug.Print($"孫TaskCount:{j}")
                    j += 1
                End While
            End Sub)
        While i < 5
          If token.IsCancellationRequested Then
              Debug.Print("子Taskは、停止しました。")
                Exit While
            End If
          Thread.Sleep(500) '0.5秒待つ
            Debug.Print($"子TaskCount:{i}")
            i += 1
        End While
        Await 孫Task
    End Function
    すると、当然、Testメソッドにtokenの引数が無いので、Testメソッド側でtokenが認識できません。当然のように思えます。
    ネットでググっても、Testメソッドの引数にキャンセルトークンを渡しているものばかりが見つかります。
    ってことは、Task.Runで、キャンセルトークンを渡す必要性がそもそも無いということになるように思いますが、間違っていますでしょうか?何のためにキャンセルトークンをTask.Runで渡すのでしょうか?
    「Taskの入れ子の待ち方」では、ラムダ式で渡していたので、Task.Runでtokenを渡さなくてもメインスレッドのtokenの状態を確認することができました。
    Task.Runで、キャンセルトークンを渡しているので、孫タスク側で何か?うまい方法でtokenを認識する方法は?無いものでしょうか?
    質問の意図が通じますでしょうか?
    宜しくお願い致します。
    

違反を報告
引用返信

▽[全レス4件(ResNo.1-4 表示)]
■34998 / ResNo.1)  Re[1]: Taskの入れ子の待ち方2
□投稿者/ Wan 付き人(57回)-(2022/01/06(Thu) 17:57:32)
  • アイコン
    因みに、Task.Runにキャンセルトークンを渡さないで、ラムダ式で引数としてtokenを渡す場合は、次のようにすると上手くいきました。
    Private Async Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click
            tokenSource = New CancellationTokenSource
            Debug.Print($"StartTask ID:{CurrentId} スレッド:{CurrentThread.ManagedThreadId}")
            Try
                Await Task.Run(Function()
                                   Return Test2(tokenSource.Token)
                               End Function)
            Finally
                tokenSource.Dispose()
            End Try
            Debug.Print($"FinishTask ID:{CurrentId} スレッド:{CurrentThread.ManagedThreadId}")
        End Sub
    
        Async Function Test2(ByVal token As CancellationToken) As Task
            Dim i As Integer = 0
            Debug.Print($"子Task ID:{CurrentId} スレッド:{CurrentThread.ManagedThreadId}")
            Dim 孫Task As Task = Task.Run(
                            Sub()
                                Dim j As Integer = 0
                                Debug.Print($"孫子Task ID:{CurrentId} スレッド:{CurrentThread.ManagedThreadId}")
                                While j < 7
                                    If token.IsCancellationRequested Then
                                        Debug.Print("孫Taskは、停止しました。")
                                        Exit While
                                    End If
                                    Thread.Sleep(500) '0.5秒待つ
                                    Debug.Print($"孫TaskCount:{j}")
                                    j += 1
                                End While
                            End Sub)
            While i < 5
                If token.IsCancellationRequested Then
                    Debug.Print("子Taskは、停止しました。")
                    Exit While
                End If
                Thread.Sleep(500) '0.5秒待つ
                Debug.Print($"子TaskCount:{i}")
                i += 1
            End While
            Await 孫Task
        End Function

違反を報告
引用返信
■34999 / ResNo.2)  Re[1]: Taskの入れ子の待ち方2
□投稿者/ Hongliang 大御所(618回)-(2022/01/06(Thu) 17:59:07)
  • アイコン// Taskを返すメソッドは基本的にAsyncサフィクスをつけてTestAsyncのようにすると見通しがいいです。

    提示されたソースによればTest自体tokenを使っているので、そもそもそのコードではコンパイルエラーになりますよね。
    孫TaskにCancellationTokenを渡したいのであれば、Testがそれを提供する必要があるでしょう(まあCancellationTokenSourceから直接取るというケースもありますが)。
    なので、TestもCancellationTokenを引数に取る必要があるでしょう。

    引数を取るメソッド、例えばFunction Test(CancellationToken)に対してTask.Runするのであれば、ラムダ式を1つ挟むようにすればいいです。
    Task.Run(Function() Test(token), ...)
違反を報告
引用返信
■35000 / ResNo.3)  Re[2]: Taskの入れ子の待ち方2
□投稿者/ Hongliang 大御所(619回)-(2022/01/06(Thu) 18:01:10)
  • アイコンつまり質問内容としては、Task.Run(..., token)のこのCancellationTokenの必要性ということですか。
    このCancellationTokenについては以下のページなどを参考にしてください。
    https://ricka.co.jp/?p=16922
違反を報告
引用返信
■35001 / ResNo.4)  Re[3]: Taskの入れ子の待ち方2
□投稿者/ Wan 付き人(58回)-(2022/01/06(Thu) 18:30:00)
  • アイコンHongliangさん
    初歩的な質問に対して、丁寧な御指南有難うございます。
    教えて頂いた、HPを含め、教えていたた内容について、熟慮したいと思います。
    また、疑問が出た場合は、お手数ですが、御指南の程よろしくお願い致します。
    有難う御座いました。
解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-4]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34990 / 親記事)  Taskの入れ子の待ち方
□投稿者/ Wan 付き人(51回)-(2022/01/06(Thu) 10:34:44)
  • アイコン環境/言語:[VisualBasic2019 Windows10 Basic Framework4.7.2] 
    分類:[.NET] 

    下記のコードは、ボタン5を押すと子タスクと孫タスクが起動して、子タスクが、孫Taskのj>7のFalseを待って、終了する積りで書いたものです。
    Dim tokenSource As New CancellationTokenSource
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    tokenSource.Cancel()
    End Sub
    Private Async Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
    tokenSource = New CancellationTokenSource
        Dim token As CancellationToken = tokenSource.Token
        Debug.Print($"StartTask ID:{CurrentId} スレッド:{CurrentThread.ManagedThreadId}")
        Try
          Await Task.Run(
              Async Sub()
                  Dim i As Integer = 0
                    Debug.Print($"子Task ID:{CurrentId} スレッド:{CurrentThread.ManagedThreadId}")
                    Dim 孫Task As Task = Task.Run(
                      Sub()
                          Dim j As Integer = 0
                            Debug.Print($"孫子Task ID:{CurrentId} スレッド:{CurrentThread.ManagedThreadId}")
                            While j < 7
                              If token.IsCancellationRequested Then
                                  Debug.Print("孫Taskは、停止しました。")
                                  Exit While
                                End If
                                Thread.Sleep(500) '0.5秒待つ
                                Debug.Print($"孫TaskCount:{j}")
                                j += 1
                            End While
                        End Sub)
                    While i < 5
                      If token.IsCancellationRequested Then
                          Debug.Print("子Taskは、停止しました。")
                            Exit While
                        End If
                        Thread.Sleep(500) '0.5秒待つ
                        Debug.Print($"子TaskCount:{i}")
                        i += 1
                    End While
                    Await 孫Task
                End Sub)
        Finally
          tokenSource.Dispose()
        End Try
        Debug.Print($"FinishTask ID:{CurrentId} スレッド:{CurrentThread.ManagedThreadId}")
    End Sub
    ところが、動かしてみると、どうも子タスクは、孫タスクの終了を待ってくれないようです。Awaitで待機しているにもかかわらず。
    なぜでしょうか?
    StartTask ID: スレッド:1
    子Task ID:1 スレッド:3
    孫子Task ID:3 スレッド:4
    孫TaskCount:0
    子TaskCount:0
      (省略)
    孫TaskCount:4
    子TaskCount:4
    FinishTask ID: スレッド:1
    孫TaskCount:5
    孫TaskCount:6
    一方、ボタン2を押すと見かけ上は、なんとなく動いているようにも見えるような結果が得られましたが、根本的な問題解決になっていないことは理解しています。また、Task.Runでtokenを渡していませんが、現時点では、意図的なものです。
    StartTask ID: スレッド:1
    子Task ID:1 スレッド:3
    孫子Task ID:3 スレッド:4
    子TaskCount:0
    孫TaskCount:0
    孫TaskCount:1
    子TaskCount:1
    子TaskCount:2
    子Taskは、停止しました。
    孫TaskCount:2
    孫Taskは、停止しました。
    FinishTask ID: スレッド:1
    子タスクが、孫タスクを待つようにするには、どのようにすれば良いのでしょうか?
    詳しい方いらっしゃいましたら、御指南頂けないでしょうか?宜しくお願い致します。
    

違反を報告
引用返信

▽[全レス5件(ResNo.1-5 表示)]
■34991 / ResNo.1)  Re[1]: Taskの入れ子の待ち方
□投稿者/ Hongliang 大御所(616回)-(2022/01/06(Thu) 11:29:38)
  • アイコン
    Visual Studio 2019をご使用とのことですが、そうであるなら、
    Await Task.Run(
        Async Sub()
    のAsync Sub()のところに警告を示す波線が引かれていると思います。
    そこにマウスオーバーすれば警告内容がツールチップで表示されます。
    また[エラー一覧]ウィンドウにも同じ内容の警告が出ていると思います。

違反を報告
引用返信
■34992 / ResNo.2)  Re[2]: Taskの入れ子の待ち方
□投稿者/ Wan 付き人(52回)-(2022/01/06(Thu) 14:59:49)
  • アイコンHongliangさんいつもお世話になっております。
    ご指摘通り、Async Function() As Taskに変更しただけで、問題なく動きました。

    でも、どこで、Task(多分?孫Task?)がReturnされるのでしょうか?
    なぜ?Functionなのでしょうか?
    お手を煩わせてすみません。

違反を報告
引用返信
■34993 / ResNo.3)  Re[3]: Taskの入れ子の待ち方
□投稿者/ Hongliang 大御所(617回)-(2022/01/06(Thu) 15:48:17)
  • アイコン
    > でも、どこで、Task(多分?孫Task?)がReturnされるのでしょうか?
    
    Awaitを含むFunctionは、コンパイラが暗黙にTaskを返却するようなコードにコンパイルします。
    Async Function Hoge() As Task
        Debug.WriteLine("enter") ' 一度Awaitするまでは同期的に実行される
        Await Task.Delay(1000) ' Task.Delayおよびそれ以降の処理がTaskとして返値になる
        Debug.WriteLine("exit")
    End Function
    
    > なぜ?Functionなのでしょうか?
    
    Subは返値なし、Functionは返値ありです。
    Sub Hoge() As Taskとは書けません。
    Taskを返したいならFunctionでなければなりません。
    Async Subと書くケースはほぼイベントハンドラのみになるはずで、
    ほとんどの場合Async Functionになります。

違反を報告
引用返信
■34994 / ResNo.4)  Re[4]: Taskの入れ子の待ち方
□投稿者/ Wan 付き人(53回)-(2022/01/06(Thu) 16:18:42)
  • アイコンHongliangさん
    お返事有難うございます。

    Awaitは、メソッド内の実行位置に関わらず、そのメソッドが終了する時に、コンパイラが忖度して呼び出し元にTaskを返すということでしょうか?

    だから、Functionで受け取らないとダメってことですね?

    有難う御座いました。
    また、よろしくお願いします。

違反を報告
引用返信
■34995 / ResNo.5)  Re[5]: Taskの入れ子の待ち方
□投稿者/ Wan 付き人(54回)-(2022/01/06(Thu) 16:19:15)
  • アイコン解決済みです。
解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-5]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34988 / 親記事)  VisualStudio2019 以降の検索ダイアログが正常に動作しない
□投稿者/ kane132 一般人(1回)-(2021/12/25(Sat) 10:24:56)
  • アイコン環境/言語:[VB.net ] 
    分類:[.NET] 

    VisualStudio2019 以降の検索ダイアログが正常に動作しません。
    有償のProfessional版、無償版ともにです。


    具体的には Ctrl+ F も、 Ctrl + Shift + F の両方で発生します。
    ソース量が膨大な場合に顕著ですが、検索範囲:「プロジェクト内」で全文検索をしても「検索が最後まで来ました」との表示がされ、意図しているファイル内まで
    見に行ってくれません。

    意図しているファイルを開き、検索範囲:「現在のドキュメント」
    で検索をすると、当該単語でヒットします。


    かなりのストレスを感じるのですが、同様の事象を経験されている方、
    解決法の分かる方、いらっしゃいませんでしょうか?

違反を報告
引用返信

▽[全レス1件(ResNo.1-1 表示)]
■34989 / ResNo.1)  Re[1]: VisualStudio2019 以降の検索ダイアログが正常に動作しない
□投稿者/ shu 大御所(495回)-(2022/01/05(Wed) 08:08:20)
  • アイコンプロジェクトにファイルが含まれていないということはありませんか?
    ソリューション全体とかフォルダとかではどうでしょうか?

違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-1]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34983 / 親記事)  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
    

違反を報告
引用返信

▽[全レス4件(ResNo.1-4 表示)]
■34984 / ResNo.1)  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 / ResNo.2)  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 / ResNo.3)  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 / ResNo.4)  Re[4]: Usingの使い方が間違っている?
□投稿者/ かけ出しVB 一般人(4回)-(2021/12/21(Tue) 14:48:24)
  • アイコン全ての謎が解けた・・って感じです。
    感謝の限りです。
    教えて頂いたページは、何度も何度も読んだつもりですが、肝心なところを読み解いていない、いわゆる猫に小判ってやつですね?
    恥ずかしいです。
    今後は、着目点を変えて、勉強をしようと思いました。
    ありがとうございました。

解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-4]



■記事リスト / ▲上のスレッド
■34979 / 親記事)  //./の意味は?
□投稿者/ かけ出しVB 一般人(1回)-(2021/12/14(Tue) 21:12:18)
  • アイコン環境/言語:[vb] 
    分類:[.NET] 

    表題通り、//./の意味は?
    pipeで、出てきます?
    //./の下にpipeフォルダが作られて、そこに何か作ってそれを、互いに見に行くことで成り立っているみたいです!
    client側の"."は、ローカルの//./って意味ですよね?
違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■34980 / ResNo.1)  Re[1]: //./の意味は?
□投稿者/ Hongliang 大御所(613回)-(2021/12/14(Tue) 22:44:37)
  • アイコンWindowsの名前付きパイプの話であれば、ここに一通り説明があります。
    https://docs.microsoft.com/en-us/windows/win32/ipc/pipe-names
    まず、区切り文字はスラッシュ "/" ではなくてバックスラッシュ "\" です。
    基本形は
    \\ServerName\pipe\PipeName
    となっています。ServerNameがサーバ名、pipeは固定文字列、PipeNameが個々の名前付きパイプを識別するパイプ名ですね。
    サーバ名が "." となっているのはお考えの通りローカルを指しています。
    なお名前付きパイプの名前は物理的なファイルやフォルダとは関係ないので、pipe がpipeフォルダを指しているというわけではないです。
違反を報告
引用返信
■34981 / ResNo.2)  Re[2]: //./の意味は?
□投稿者/ かけだしVB 一般人(1回)-(2021/12/16(Thu) 16:59:13)
  • アイコンHongliangさん
    お礼の返事が遅くなりすみませんでした
    教えて頂いたページを読んで、追加質問をと考えていたら時間が過ぎてしまいました。
    てっきり、物理的フォルダーを仮に作って、そこにファイルを書き込むか?作業領域として使っているのか?と思っていましたが、そんな単純じゃないんですね?
    教えて頂いたページにwin32とあるので、C言語に対するページですかね?
    VBのコードが無かったので・・・・
    ありがとうございました。
    勉強を続けます。

解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-2]






Mode/  Pass/


- Child Tree -