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

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

C# と VB.NET の入門サイト

VB.Net Main関数の非同期処理について

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

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

分類:[.NET 全般] 

VB.Net フレームワーク4.8で開発を行っています。
複数のファイルを読み込み、読み込みデータを元にファイルを作成し出力する、というバッチを作成しています。
Main関数から、複数の非同期処理を呼び出したいのですが、呼び出した非同期処理がすべて完了するまで
待機したいです。Async、Awaitを使えば簡単にできることだと思いますが、Main関数をAsyncで宣言して良いのか、
また、Mian関数を非同期処理として作成する方法がわかりません。
どなたか詳しい方、ご教授お願いいたします。
引用返信 編集キー/
■97662 / inTopicNo.2)  Re[1]: VB.Net Main関数の非同期処理について
□投稿者/ Hongliang (1183回)-(2021/06/23(Wed) 14:47:42)
最近のC#だと async Task Main() とできるんですが、VBだと無理ですね。
Main自体は普通にして、非同期処理が返すTaskを待機するようにすればいいでしょう。

Sub Main()
  Dim result = HeavyWorkAsync().GetAwaiter().GetResult()
End Sub

引用返信 編集キー/
■97663 / inTopicNo.3)  Re[1]: VB.Net Main関数の非同期処理について
□投稿者/ 魔界の仮面弁士 (3137回)-(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 にする必要は無いのでは。
引用返信 編集キー/
■97666 / inTopicNo.4)  Re[2]: VB.Net Main関数の非同期処理について
□投稿者/ RS (3回)-(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()について調べてみます。
ありがとうございました。
引用返信 編集キー/
■97667 / inTopicNo.5)  Re[2]: VB.Net Main関数の非同期処理について
□投稿者/ RS (4回)-(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できないかな、と、、、







引用返信 編集キー/
■97668 / inTopicNo.6)  Re[3]: VB.Net Main関数の非同期処理について
□投稿者/ 魔界の仮面弁士 (3139回)-(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
引用返信 編集キー/
■97669 / inTopicNo.7)  Re[4]: VB.Net Main関数の非同期処理について
□投稿者/ RS (5回)-(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

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


解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ