亀岡的プログラマ日記

京都のベッドタウン、亀岡よりだらだらとお送りいたします。

BeginInvokeとEndInvoke

今更ながらCodeProjectからおしえられるとゆー。

The methods BeginInvoke and EndInvoke will do all the work for you. BeginInvoke will process your asychronous call in a new thread. EndInvoke will return you the result from that thread. If the thread is not completed when you are calling EndInvoke, it will wait. You don't have to implement your wait loop in the main thread. The status of each asynchronous operations are saved in the IAsynicResult object, so one delegate can handle multiple invokes.

つまり、EndInvokeの実行はBeginInvokeしたデリゲートが終了するまで遅延されるので、ウェイトに使えるってことなのか。

ま、百聞は一見にしかず。

        static void Main()
        { 
            Random rnd = new Random();
            //非同期実行用デリゲート
            Func<int, int> deleg = (wait) =>
                {
                    Thread.Sleep(wait);
                    return rnd.Next();
                };
            
            //待ち時間を変えて実行
            var rst1 = deleg.BeginInvoke(1000, null, null);
            var rst2 = deleg.BeginInvoke(5000, null, null);
            var rst3 = deleg.BeginInvoke(10000, null, null);
            //EndInvokeで待つ
            Console.WriteLine(
                String.Format("Result: {0}\t{1}\t{2}",
                deleg.EndInvoke(rst1),
                deleg.EndInvoke(rst2),
                deleg.EndInvoke(rst3)));
            Console.Read();
        }

これできっちり待ってくれます。
こりゃ便利だ。