AsyncResult

これまでは、BeginInvokeで非同期処理を実行してから、EndInvokeで非同期処理が終わるのを待っていた・・・。
しかし、これだと同期的に処理している事と変わらない・・・。
BeginInvokeで非同期処理を実行した後も、Mainは先の処理を進めつつ、一方で非同期処理完了後のコールバックで終了を通知する形が本来の非同期処理と言えるだろう・・・。

コールバックメソッドの引数IAsyncResultをAsyncResultにキャストすると、IAsyncResultではアクセスできないプロパティを取得できる・・・。

AsyncResult クラス (System.Runtime.Remoting.Messaging)

その中には非同期処理に使ったデリゲートもあり、EndInvokeで結果の値を取得出来たりする・・・。

Main側でEndInvokeを呼ばず、コールバック側でEndInvokeを呼んで結果を取得する・・・。

int型a, bを引数に取り、戻り値はintになるメソッドのデリゲートAsyncronousFuncDelegate・・・。

asyncronousFunc、callback、を生成して、asyncronousFunc.BeginInvokeには、10、20とcallbackなど指定・・・。
"AsyncronousFunc..."と出力したら終わりなのだが、コンソールだとMainが終わってしまうと非同期処理側も実行されないので、Console.ReadKeyで入力されるまで待つ・・・。
(結局、実質的には同期的になっている・・・。Windowsアプリケーションなら終わらないで待てるが・・・。)

非同期処理AsyncronousFuncは、3秒休止したら引数のaとbの足した結果を返す・・・。

非同期処理完了後のコールバックでは、引数のarをIAsyncResultからAsyncResultにキャストしてasyncResに・・・。
asyncRes.AsyncDelegateで非同期処理に使ったasyncronousFuncを取得できる・・・。(objectで格納されてるのでAsyncronousFuncDelegateにキャストする必要あり・・・。)
これでasyncronousFunc.EndInvokeでAsyncronousFuncの戻り値resultを取得できる・・・。

AsyncronousFunc...
result = 30
続行するには何かキーを押してください . . .

コンソールだからMain側は結局待ったが、Windowsアプリケーションなら、Main側が終了してから随分あとに通知することもできる・・・。

Sample/dotnet/AsyncResult/AsyncResult/src/AsyncResult_ at master · bg1bgst333/Sample · GitHub