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

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

■34948 / inTopicNo.1)  Task.Runの使い方
  
□投稿者/ Wan 一般人(43回)-(2021/11/11(Thu) 14:21:02)
  • アイコン環境/言語:[Windows10 VisualStudio2019 VB.net WindowsForm] 
    分類:[.NET] 

    Task.Runについて勉強を始めました。
    Task.Runメソッドのオーバーロードとして
    Run<TResult>(Func<Task<TResult>>)
    のパターンのサンプルを作成しようと、次の様なコードを考えたのですが、
    返値(“終わり”)の取得方法が分かりません。
    
    Dim proc_inl =
    Async Function()
           Await Task.Delay(500) '0.5秒待つ
           Debug.Print("Task")
           Return "終わり"
        End Function
    Await Task.Run(proc_inl) &#8656;Runにカーソルを合わせると
    '*** ここで、「終わり」を取得したい ***
    
    上記のコードでRunの部分にカーソルを合わせると、次のように表示されるので
    Public Shared Function Run(Of TResult)(function As Func(Of Task(Of TResult))) As Task(Of TResult)
    
    Run<TResult>(Func<Task<TResult>>)の形になっていると思います。
    
    また、Async Function()としないと、Run<TResult>(Func<Task<TResult>>)の形にできないのでしょうか?※外して色々こねくり回してみましたが、上手く行きません。
    次のように変更すると、Run<TResult>(Func<TResult>)の形になってしまいます。
    Dim Tasks = Task.Run(
    Function() As String
            Debug.Print("Task")
            Return "終わり"
    End Function)
    Debug.Print(Tasks.Result)
    
    詳しい方、ご指南頂けないでしょうか?
    教えて頂きたい内容が上手く伝えられていないような気がしますが、宜しくお願い致します。
    

引用返信 削除キー/
■34949 / inTopicNo.2)  Re[1]: Task.Runの使い方
□投稿者/ Hongliang 大御所(610回)-(2021/11/11(Thu) 17:45:14)
  • アイコン> Await Task.Run(proc_inl) &#8656;Runにカーソルを合わせると
    > '*** ここで、「終わり」を取得したい ***

    Task(Of T)の返値は、Await演算子により取得できます。
    Dim ret = Await Task.Run(proc_inl)

    > また、Async Function()としないと、Run<TResult>(Func<Task<TResult>>)の形に
    > できないのでしょうか?※外して色々こねくり回してみましたが、上手く行きません。

    とりあえずTask.Runのところからは消してみました。
    ' Private Shared http As New HttpClient()

    ' HttpClient::GetStringAsyncの返値はTask(Of String)なので、
    ' それを返すラムダ式はFunc(Of Task(Of String))になる
    Dim ret = Await Task.Run(Function()
    Retrun http.GetStringAsync("https://example.com/")
    End Function)

    まあ実用上はAsync/Awaitが入ってくるのが普通かなと思います。
    GetStringAsyncをAwaitした結果を解析するとか。
引用返信 削除キー/
■34950 / inTopicNo.3)  Re[2]: Task.Runの使い方
□投稿者/ Wan 一般人(44回)-(2021/11/12(Fri) 11:45:58)
  • アイコン
    Hongliang 様
    ご指南有難う御座います。
    取得できました。
    
    ところが・・・
    別スレッドで動いていると思っていたのですが、IDをとったところ
    Nothingとなってしまいます。
    パターンA
     Private Async Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            'Run(Func<Task>)
            'Public Shared Function Run(function As Func(Of Task)) As Task
            '↓Dim proc_inl As Func(Of Task)
            Dim proc_inl =
                Async Function()
                    Await Task.Delay(100) '0.5秒待つ
                    Debug.Print($"別TaskA:{Task.CurrentId}")
                End Function
            Await Task.Run(proc_inl)
        End Sub
    
    パターンC
      Private Async Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
            'Run<TResult>(Func<Task<TResult>>)
            'Public Shared Function Run(Of TResult)(function As Func(Of Task(Of TResult))) As Task(Of TResult)
            '↓Dim proc_inl As Func(Of Task(Of String))
            Dim proc_inl =
                Async Function()
                    Await Task.Delay(100) '0.5秒待つ
                    Debug.Print($"別TaskC:{Task.CurrentId}")
                    Return "終わりC"
                End Function
            Debug.Print(Await Task.Run(proc_inl))
        End Sub
    
    また、パターンBの場合は、別スレッドとなりますが、Await Task.Runが使えないようです。
       Private Async Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
            'Run<TResult>(Func<TResult>)
            'Public Shared Function Run(Of TResult) (function As Func(Of TResult)) As Task(Of TResult)
            '↓ Dim Tasks As Task(Of String)
            Dim proc_inl = New Task(Of String)(
               Function() As String
                   Task.Delay(100) '0.5秒待つ
                   Debug.Print($"別TaskB:{Task.CurrentId}")
                   Return "終わりB"
               End Function)
            proc_inl.Start()
            Debug.Print(Await proc_inl) 'Resultは、内部的にAwaitを呼び出している
        End Sub

引用返信 削除キー/
■34951 / inTopicNo.4)  Re[3]: Task.Runの使い方
□投稿者/ Hongliang 大御所(611回)-(2021/11/12(Fri) 18:41:54)
  • アイコンTask上で動いていることと、別スレッドで動いていることは別のことです。
    どのスレッドで動いているか確認したい場合、Thread.CurrentThread.ManagedThreadIdを使用してください。

    あまり突っ込んで考えたことはありませんが、おそらくAwait以降の処理はTaskから離れてスレッドプール上で動く単なるデリゲートという感じなのでしょうね、多分。
引用返信 削除キー/
■34952 / inTopicNo.5)  Re[4]: Task.Runの使い方
□投稿者/ wan 一般人(2回)-(2021/11/13(Sat) 06:22:25)
  • アイコン御指南有難うございます!
    色々と自分なりにこねくり回してみます!
    また、詰まったらヒントを頂きに来ますので、宜しくお願い致します

    ありがとうございました
解決み!
引用返信 削除キー/



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

このトピックに書きこむ

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

Mode/  Pass/


- Child Tree -