// 非同期処理完了後のスタティックコールバックメソッドAsyncCallbackFunc. static void AsyncCallbackFunc(IAsyncResult ar) { // IAsyncResult型arをAsyncResultにキャスト. AsyncResult asyncRes = (AsyncResult)ar; // arをAsyncResult型asyncResにキャスト. // 非同期処理で使ったデリゲートを取得. AsyncronousFuncDelegate asyncronousFunc = (AsyncronousFuncDelegate)asyncRes.AsyncDelegate; // asyncRes.AsyncDelegateをキャストしてasyncronousFuncを取得. // 非同期処理の結果を取得.(非同期処理は完了してるのですぐ終わる.) int result = asyncronousFunc.EndInvoke(ar); // asyncronousFunc.EndInvokeで結果resultを取得. // 結果の出力. Console.WriteLine("result = " + result); // Console.WriteLineでresultを出力. }
// Mainメソッドの定義 static void Main() { // 非同期処理で実行するデリゲートasyncronousFuncの生成. AsyncronousFuncDelegate asyncronousFunc = new AsyncronousFuncDelegate(AsyncronousFunc); // AsyncronousFuncを非同期実行するAsyncronousFuncDelegateオブジェクトasyncronousFuncを生成. // 非同期処理の完了後に実行するAsyncCallbackデリゲートcallbackの生成. AsyncCallback callback = new AsyncCallback(AsyncCallbackFunc); // 非同期処理完了後にAsyncCallbackFuncを実行するAsyncCallbackオブジェクトcallbackを生成. // 非同期処理の実行. IAsyncResult iar = asyncronousFunc.BeginInvoke(callback, null); // コンパイラによって生成されたasyncronousFunc.BeginInvokeで非同期実行し, 戻り値のIAsyncResultオブジェクトをiarに格納.(非同期実行完了後のコールバック関数callbackを渡す.) // 非同期処理の完了まで待機. asyncronousFunc.EndInvoke(iar); // asyncronousFunc.EndInvokeで完了まで待つ.(iarを渡す.) // AsyncCallbackFuncの処理が残ってるので3秒待つ. Thread.Sleep(3000); // Thread.Sleepで3秒休止. // "Finish!"と出力. Console.WriteLine("Finish!"); // "Finish!"と出力. }
// Mainメソッドの定義 static void Main() { // 変数の宣言・初期化. int result; // 計算結果を格納するint型result. int refValue = 0; // AsyncronousFuncに参照渡しで渡すint型refValueを0で初期化. // デリゲートの生成. AsyncronousFuncDelegate asyncronousFunc = new AsyncronousFuncDelegate(AsyncronousFunc); // AsyncronousFuncを非同期実行するAsyncronousFuncDelegateオブジェクトasyncronousFuncを生成. // 非同期処理の実行. IAsyncResult iar = asyncronousFunc.BeginInvoke(10, 20, ref refValue, null, null); // コンパイラによって生成されたasyncronousFunc.BeginInvokeで非同期実行し, 戻り値のIAsyncResultオブジェクトをiarに格納.(引数として10, 20, refValueを渡す.) // "Calculating..."と出力. Console.WriteLine("Calculating..."); // "Calculating..."と出力. // 計算結果の取得. result = asyncronousFunc.EndInvoke(ref refValue, iar); // asyncronousFunc.EndInvokeで完了まで待って, 計算結果を取得する.(resultにもrefValueにも計算結果が格納されている.) // 計算結果の出力. Console.WriteLine("result = " + result); // resultの値を出力. Console.WriteLine("refValue = " + refValue); // refValueの値を出力. }
// Mainメソッドの定義 static void Main() { // デリゲートの生成. AsyncronousFuncDelegate asyncronousFunc = new AsyncronousFuncDelegate(AsyncronousFunc); // AsyncronousFuncを非同期実行するAsyncronousFuncDelegateオブジェクトasyncronousFuncを生成. // 非同期処理の実行. IAsyncResult iar = asyncronousFunc.BeginInvoke(null, null); // コンパイラによって生成されたasyncronousFunc.BeginInvokeで非同期実行し, 戻り値のIAsyncResultオブジェクトをiarに格納. // 非同期処理の状態を監視. while (!iar.IsCompleted) // iar.IsCompletedがfalseの時は繰りかえす. { // "AsyncronousFunc Running..."の出力. Console.WriteLine("AsyncronousFunc Running..."); // Console.WriteLineで"AsyncronousFunc Running..."を出力. // 1秒休止. Thread.Sleep(1000); // Thread.Sleepで1000ミリ秒(1秒)休止. } // 非同期処理は完了しているのですぐ終わる. asyncronousFunc.EndInvoke(iar); // asyncronousFunc.EndInvokeで完了まで待つ.(iar.IsCompletedがtrueになり, ここに抜けてきてるので, すぐ終わる.) // "Finish!"の出力. Console.WriteLine("Finish!"); // Console.WriteLineで"Finish!"と出力. }
// Mainメソッドの定義 static void Main() { // デリゲートの生成. AsyncronousFuncDelegate asyncronousFunc = new AsyncronousFuncDelegate(AsyncronousFunc); // AsyncronousFuncを非同期実行するAsyncronousFuncDelegateオブジェクトasyncronousFuncを生成. // 非同期処理の実行. IAsyncResult iar = asyncronousFunc.BeginInvoke(null, null); // コンパイラによって生成されたasyncronousFunc.BeginInvokeで非同期実行し, 戻り値のIAsyncResultオブジェクトをiarに格納. // "Main(1)"〜"Main(3)"を出力. for (int i = 1; i <= 3; i++) // iが1から3まで繰り返す. { // "Main(i)"の出力. Console.WriteLine("Main(" + i + ")"); // Console.WriteLineで"Main(i)"を出力. // 1秒休止. Thread.Sleep(1000); // Thread.Sleepで1000ミリ秒(1秒)休止. } // 非同期処理の完了まで待機. asyncronousFunc.EndInvoke(iar); // asyncronousFunc.EndInvokeで完了まで待つ.(iarを渡す.) // "Finish!"と出力. Console.WriteLine("Finish!"); // "Finish!"と出力. }