非同期で呼び出す

デリゲートを非同期で呼び出します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. デリゲート呼び出しは非同期に行うことも出来ます。
    通常、メソッドを呼び出すとメソッド内の処理が完了するまで呼び出し元には戻ってきません。
    このような動作を同期呼び出し (Synchronous Call) と呼びます。
    それに対して、非同期呼び出し (Asynchronous Call) とは、 メソッドを呼び出した瞬間に呼び出し元に処理が戻ってくるような呼び出しのことです。
    デリゲートの非同期呼び出しをすると、 デリゲートを介して呼び出されるメソッドの処理と、呼び出し元の処理が平行して行われることになります。
  2. デリゲート型を定義すると、 C# コンパイラによって自動的に BeginInvoke と EndInvoke というメソッドが生成されます。
    この BeginInvoke を用いることにより非同期呼び出しを開始し、 EndInvoke を用いることにより非同期処理の終了を待つ事が出来ます。
  3. 非同期で Delegate を呼び出すサンプルプログラムです。
    //★ 非同期で Delegate を呼び出す
    using System;
    using System.Threading;
    
    // デリゲートの定義
    public delegate void ShowMessage(int n);
    
    public class DelegateTest
    {
        public static void Main()
        {
            const int N = 6;
            ShowMessage asyncCall = new ShowMessage(AsynchronousMethod);
    
            // asyncCall を非同期で呼び出す。
            IAsyncResult ar = asyncCall.BeginInvoke(N, null, null);
    
            // ↓この部分は asyncCall によって呼び出されるメソッドと同時に実行されます。
            for(int i=0; i<N; ++i)
            {
                Thread.Sleep(600);
                Console.Write("Main ({0})\n", i);
            }
    
            // asyncCall の処理が終わるのを待つ。
            asyncCall.EndInvoke(ar);
    
            Console.Write(" 処理完了\n");
            Console.ReadLine();
        }
    
        // デリゲートから呼び出される static メソッド
        static void AsynchronousMethod(int n)
        {
            for(int i=0; i<n; ++i)
            {
                Thread.Sleep(1000);
                Console.Write("AsynchronousMethod ({0})\n", i);
            }
        }
    }
    
  4. このページの作成にあたって、次のホームページを参考にしました。
    ++C++; // 未確認飛行 C

超初心者のプログラム入門(C# Frame Work)