委託的Invoke與BeginInvoke

委託的Invoke是同步調用,等價於直接使用()來執行。異步

BeginInvoke是異步調用,BeginInvoke直接返回,EndInvoke阻塞直到委託執行結束。spa

下面這段代碼能夠很清晰的把這幾個方法描述清楚:code

            // 定義一個委託
            Func<string, string> f = new Func<string, string>((s)=> {
                for (int i = 0; i <= 100; i += 10)
                {
                    Thread.Sleep(200);
                }
                return "ThreadId: " + Thread.CurrentThread.ManagedThreadId + " - ActionResult: " + s;
            });

            // 阻塞方式執行,下面兩種調用方式是等價的
            string r1 = f("A");
            string r2 = f.Invoke("A");
            MessageBox.Show(r1 + " - " + r2);

            AsyncCallback callback = new AsyncCallback((iar) =>
            {
                // 經過f.EndInvoke(ar)得到委託的返回值
                // 若是不能經過上下文得到f,也能夠這樣得到:(Func<string, string>)(iar as AsyncResult).AsyncDelegate
                // iar.AsyncState是BeginInvoke調用時傳入的@object參數
                MessageBox.Show(f.EndInvoke(iar) + " - " + iar.AsyncState);
            });

            // BeginInvoke調用當即返回
            IAsyncResult result = f.BeginInvoke("for delegate", callback, "for callback");

            // 查詢異步調用是否結束,結束時callback同時被調用
            // 超時返回false,調用結束返回true
            int timeOutCount = 0;
            while (!result.AsyncWaitHandle.WaitOne(10))
            {
                timeOutCount++;
            }
            MessageBox.Show("超時次數:" + timeOutCount);
相關文章
相關標籤/搜索