BeginInvoke

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