C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.97661 の関連記事表示

<< 0 >>
■97661  VB.Net Main関数の非同期処理について
□投稿者/ RS -(2021/06/23(Wed) 14:18:02)

    分類:[.NET 全般] 

    VB.Net フレームワーク4.8で開発を行っています。
    複数のファイルを読み込み、読み込みデータを元にファイルを作成し出力する、というバッチを作成しています。
    Main関数から、複数の非同期処理を呼び出したいのですが、呼び出した非同期処理がすべて完了するまで
    待機したいです。Async、Awaitを使えば簡単にできることだと思いますが、Main関数をAsyncで宣言して良いのか、
    また、Mian関数を非同期処理として作成する方法がわかりません。
    どなたか詳しい方、ご教授お願いいたします。
親記事 /過去ログ169より / 関連記事表示
削除チェック/

■97663  Re[1]: VB.Net Main関数の非同期処理について
□投稿者/ 魔界の仮面弁士 -(2021/06/23(Wed) 14:56:55)
    2021/06/23(Wed) 14:58:31 編集(投稿者)

    No97661 (RS さん) に返信
    > Main関数から、複数の非同期処理を呼び出したいのですが、
    「関数」という事は、Sub Main() ではなく、Function Main() As Integer なのかな?


    > 呼び出した非同期処理がすべて完了するまで待機したいです。
    Task.WaitAll メソッドを試してみてください。
    https://docs.microsoft.com/ja-jp/dotnet/api/system.threading.tasks.task.waitall?view=netframework-4.8

    > Main関数をAsyncで宣言して良いのか、
    > また、Mian関数を非同期処理として作成する方法がわかりません。
    終了するまで待ち合わせるのであれば、その呼び出し元は
    非同期処理では無く、同期処理ということになりますので、
    Async Main にする必要は無いのでは。
記事No.97661 のレス /過去ログ169より / 関連記事表示
削除チェック/

■97667  Re[2]: VB.Net Main関数の非同期処理について
□投稿者/ RS -(2021/06/23(Wed) 16:31:43)
    No97663 (魔界の仮面弁士 さん) に返信
    > 2021/06/23(Wed) 14:58:31 編集(投稿者)
    >
    > ■No97661 (RS さん) に返信
    >>Main関数から、複数の非同期処理を呼び出したいのですが、
    > 「関数」という事は、Sub Main() ではなく、Function Main() As Integer なのかな?

    Sub Main()です。


    >>呼び出した非同期処理がすべて完了するまで待機したいです。
    > Task.WaitAll メソッドを試してみてください。
    > https://docs.microsoft.com/ja-jp/dotnet/api/system.threading.tasks.task.waitall?view=netframework-4.8

    Task.WaitAll(非同期処理のList)としてみたのですが、ログを見る限り、タスクは開始されていましたが
    このタスクが完了する前にMainの処理が終わってしまっていました。


    >>Main関数をAsyncで宣言して良いのか、
    >>また、Mian関数を非同期処理として作成する方法がわかりません。
    > 終了するまで待ち合わせるのであれば、その呼び出し元は
    > 非同期処理では無く、同期処理ということになりますので、
    > Async Main にする必要は無いのでは。

    すみません、色々試しているうちに混乱してしまい、、、
    非同期処理がすべて完了する前に、Mainの処理が終わってしまい、結果非同期メソッドの中の処理が終わる前に
    アプリケーション自体が終わってしまっているのでは、と考えました。
    なので、非同期処理を呼び出しているMainでAwiteできないかな、と、、、






記事No.97661 のレス /過去ログ169より / 関連記事表示
削除チェック/

■97668  Re[3]: VB.Net Main関数の非同期処理について
□投稿者/ 魔界の仮面弁士 -(2021/06/23(Wed) 17:24:10)
    2021/06/23(Wed) 17:33:23 編集(投稿者)

    No97667 (RS さん) に返信
    > Task.WaitAll(非同期処理のList)としてみたのですが、ログを見る限り、タスクは開始されていましたが
    > このタスクが完了する前にMainの処理が終わってしまっていました。

    WaitAll が受け付けるのは配列です。List は渡せませんよ。
    WhenAll と勘違いしていませんか?


    Task.WhenAll の場合、Task の終了を待たずに次の行に進みます。
    Task.WaitAll の場合、Task が終わるまでスレッドをブロックします。


    Imports System.Diagnostics
    Imports System.Threading
    Imports System.Threading.Tasks

    Module Module1
     Sub Main()
      Dim sw = Stopwatch.StartNew()
      Dim t1 As New List(Of Task)()
      t1.Add(Task.Run(Sub() Thread.Sleep(2000)))
      t1.Add(Task.Run(Sub() Task.Delay(2000)))
      t1.Add(Task.Delay(2000))
      Console.WriteLine("===> Task.WhenAll Start")
      Dim t = Task.WhenAll(t1)
      Console.WriteLine("<=== Task.WhenAll End at " & sw.Elapsed.ToString())
      t.Wait()
      Console.WriteLine("<=== Task.WhenAll Finished " & sw.Elapsed.ToString())

      sw = Stopwatch.StartNew()
      Dim t2 As New List(Of Task)()
      t2.Add(Task.Run(Sub() Thread.Sleep(2000)))
      t2.Add(Task.Run(Sub() Task.Delay(2000)))
      t2.Add(Task.Delay(2000))
      Console.WriteLine("===> Task.WaitAll Start")
      'Console.WriteLine(Task.WaitAll(t2.ToArray(), TimeSpan.FromMilliseconds(700)))
      'Console.WriteLine(Task.WaitAll(t2.ToArray(), Timeout.Infinite))
      Task.WaitAll(t2.ToArray())
      Console.WriteLine("<=== Task.WaitAll End at " & sw.Elapsed.ToString())

      Console.WriteLine("Hit Any Key...")
      Console.ReadKey()
     End Sub

    End Module
記事No.97661 のレス /過去ログ169より / 関連記事表示
削除チェック/

■97669  Re[4]: VB.Net Main関数の非同期処理について
□投稿者/ RS -(2021/06/23(Wed) 17:43:12)
    No97668 (魔界の仮面弁士 さん) に返信
    > 2021/06/23(Wed) 17:33:23 編集(投稿者)
    >
    > ■No97667 (RS さん) に返信
    >>Task.WaitAll(非同期処理のList)としてみたのですが、ログを見る限り、タスクは開始されていましたが
    >>このタスクが完了する前にMainの処理が終わってしまっていました。
    >
    > WaitAll が受け付けるのは配列です。List は渡せませんよ。
    > WhenAll と勘違いしていませんか?
    >
    >
    > Task.WhenAll の場合、Task の終了を待たずに次の行に進みます。
    > Task.WaitAll の場合、Task が終わるまでスレッドをブロックします。
    >
    >
    > Imports System.Diagnostics
    > Imports System.Threading
    > Imports System.Threading.Tasks
    >
    > Module Module1
    >  Sub Main()
    >   Dim sw = Stopwatch.StartNew()
    >   Dim t1 As New List(Of Task)()
    >   t1.Add(Task.Run(Sub() Thread.Sleep(2000)))
    >   t1.Add(Task.Run(Sub() Task.Delay(2000)))
    >   t1.Add(Task.Delay(2000))
    >   Console.WriteLine("===> Task.WhenAll Start")
    >   Dim t = Task.WhenAll(t1)
    >   Console.WriteLine("<=== Task.WhenAll End at " & sw.Elapsed.ToString())
    >   t.Wait()
    >   Console.WriteLine("<=== Task.WhenAll Finished " & sw.Elapsed.ToString())
    >
    >   sw = Stopwatch.StartNew()
    >   Dim t2 As New List(Of Task)()
    >   t2.Add(Task.Run(Sub() Thread.Sleep(2000)))
    >   t2.Add(Task.Run(Sub() Task.Delay(2000)))
    >   t2.Add(Task.Delay(2000))
    >   Console.WriteLine("===> Task.WaitAll Start")
    >   'Console.WriteLine(Task.WaitAll(t2.ToArray(), TimeSpan.FromMilliseconds(700)))
    >   'Console.WriteLine(Task.WaitAll(t2.ToArray(), Timeout.Infinite))
    >   Task.WaitAll(t2.ToArray())
    >   Console.WriteLine("<=== Task.WaitAll End at " & sw.Elapsed.ToString())
    >
    >   Console.WriteLine("Hit Any Key...")
    >   Console.ReadKey()
    >  End Sub
    >
    > End Module

    なるほど!完全に勘違いしていました。
    解決できそうです!ありがとうございます!

記事No.97661 のレス / END /過去ログ169より / 関連記事表示
削除チェック/

■97662  Re[1]: VB.Net Main関数の非同期処理について
□投稿者/ Hongliang -(2021/06/23(Wed) 14:47:42)
    最近のC#だと async Task Main() とできるんですが、VBだと無理ですね。
    Main自体は普通にして、非同期処理が返すTaskを待機するようにすればいいでしょう。
    
    Sub Main()
      Dim result = HeavyWorkAsync().GetAwaiter().GetResult()
    End Sub
記事No.97661 のレス /過去ログ169より / 関連記事表示
削除チェック/

■97666  Re[2]: VB.Net Main関数の非同期処理について
□投稿者/ RS -(2021/06/23(Wed) 16:17:41)
    No97662 (Hongliang さん) に返信
    > 最近のC#だと async Task Main() とできるんですが、VBだと無理ですね。
    > Main自体は普通にして、非同期処理が返すTaskを待機するようにすればいいでしょう。
    >
    > Sub Main()
    > Dim result = HeavyWorkAsync().GetAwaiter().GetResult()
    > End Sub

    ご教授いただきありがとうございます。
    C#なら簡単にできるんですね、、、。
    GetAwaiter().GetResult()について調べてみます。
    ありがとうございました。
記事No.97661 のレス /過去ログ169より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -