< as | アセンブリ参照 >

July 18, 2008

デリゲートの非同期呼び出し

デリゲートを定義すると、自動的に BeginInvokeEndInvoke というメソッドが定義される。
System.IAsyncResult Delegate::BeginInvoke (orgparams, System.AsyncCallback callback, object @object);
orgtype Delegate::EndInvake (System.IAsyncResult result);
これらを呼び出すことによって、非同期の呼び出しを実現できる。
class MessageBox
{
    // デリゲートを宣言
    delegate System.Windows.Forms.DialogResult MessageBoxDelegate (string text, string caption, System.Windows.Forms.MessageBoxButtons buttons, System.Windows.Forms.MessageBoxIcon icon);

    // メッセージボックスを表示するメソッド
    System.Windows.Forms.DialogResult Show (string text, string caption, System.Windows.Forms.MessageBoxButtons buttons, System.Windows.Forms.MessageBoxIcon icon)
    {
        return System.Windows.Forms.MessageBox.Show (text, caption, buttons, icon);
    }

    static void Main ()
    {
        MessageBox msgBox = new MessageBox ();

        // デリゲート作成
        MessageBoxDelegate msgBoxDelegate = new MessageBoxDelegate (msgBox.Show);

        // 非同期に呼び出す
        System.IAsyncResult asyncResult = msgBoxDelegate.BeginInvoke ("ボタンが押されるのを待機します。", "待機中", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Information, null, null);

        // 終了まち
        while (!asyncResult.IsCompleted)
        {
            System.Threading.Thread.Sleep (1000);
            System.Console.WriteLine ("マダー?");
        }
        // 戻り値を取得
        System.Windows.Forms.DialogResult result = msgBoxDelegate.EndInvoke (asyncResult);
    }
}

トラックバック

このエントリーにトラックバック:
http://frog.raindrop.jp/cgi-bin/mt/mt-tb.cgi/2138

コメント

コメントする

※ コメントスパム対策のため、コメント本文はおはよう、こんにちわ、こんばんわのいずれかより始めるようにしてください。

name:
email:

※ 必要ですが、表示しません。

url:
情報を保存する ?