これまでは、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