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

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

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

No.97668 の関連記事表示

<< 0 >>
■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より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -