|
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
|