ThreadやThreadPoolを使わなくても、デリゲートで非同期処理が実行できる・・・。
(実際には内部でThreadPoolを使っているのだが・・・。)
Calling Synchronous Methods Asynchronously
delegate型を定義すると、C#コンパイラが自動でBeginInvoke、EndInvokeなどのメソッドを用意してくれて、デリゲートオブジェクトはそれらを使うことができる・・・。
(Delegateなどの基底クラスメソッドとかではないようなので、.NET FrameworkカテゴリではなくC#カテゴリにした・・・。)
引数も戻り値も無いデリゲートAsyncronousFuncDelegateを定義・・・。
AsyncronousFuncを非同期で実行するAsyncronousFuncDelegateオブジェクトasyncronousFuncを生成・・・。
AsyncronousFuncは、
AsyncronousFunc(i)の表示を1秒毎に計5回繰り返す・・・。
asyncronousFunc.BeginInvokeで非同期実行開始・・・。
こちらはMain(i)の表示を1秒毎に計3回繰り返す・・・。
なので、Mainの方が先に終わる・・・。
asyncronousFunc.EndInvokeで非同期処理が終わるまで待っている状態になる・・・。
asyncronousFunc.EndInvokeから抜けたら"Finish!"と表示・・・。
Main(1) AsyncronousFunc(1) Main(2) AsyncronousFunc(2) Main(3) AsyncronousFunc(3) AsyncronousFunc(4) AsyncronousFunc(5) Finish! 続行するには何かキーを押してください . . .
(3)までは、MainとAsyncronousFuncは1つずつ同時並行で出力される・・・。
しかし、AsyncronousFuncは(4)と(5)が残っているので、それらが出力し終わるまで、Mainは待ち続ける・・・。
そして終わったら、"Finish!"を表示・・・。
Sample/cs/BeginInvoke/BeginInvoke/src/BeginInvoke_ at master · bg1bgst333/Sample · GitHub