1. 程式人生 > >異步委托

異步委托

back execute 執行 是否 call 異步執行 con 選擇 後臺

委托實現多窗體傳值

主窗體的代碼:

  public partial class FrmMain : Form
    {
        //[3] 創建委托對象(委托對象能夠將委托和具體方法關聯) 
        public ShowCounterDelegate msgSender;


        public FrmMain()
        {
            InitializeComponent();
            //創建從窗體對象
            FrmOther01 objFrm01 = new FrmOther01();
            FrmOther02 objFrm02 = new FrmOther02();
            FrmOther03 objFrm03 = new FrmOther03();

            //4.將委托變量和具體方法關聯
            this.msgSender += objFrm01.Receiver;
            this.msgSender += objFrm02.Receiver;
            this.msgSender += objFrm03.Receiver;

            //顯示三個從窗體
            objFrm01.Show();
            objFrm02.Show();
            objFrm03.Show();
        }
        private int counter = 0;
        /// <summary>
        /// 發消息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnClick_Click(object sender, EventArgs e)
        {
            counter++;
            //msgSender(counter.ToString()); //5.調用委托變量傳遞信息
            msgSender.Invoke(counter.ToString());
        }
        /// <summary>
        /// 復位
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnReset_Click(object sender, EventArgs e)
        {
            counter = 0;
            msgSender("0");
        }
    }

    //1.聲明委托
    public delegate void ShowCounterDelegate(string counter);

子窗體的代碼:

  //2.根據委托定義方法(接收委托傳遞的信息)
        public void Receiver(string counter)
        {
            this.IblCounter.Text = counter;
        }
 //2.根據委托定義方法(接收委托傳遞的信息)
        public void Receiver(string counter)
        {
            this.IblCounter.Text = counter;
        }
  //2.根據委托定義方法(接收委托傳遞的信息)
        public void Receiver(string counter)
        {
            this.IblCounter.Text = counter;
        }

同步委托和異步委托

 public partial class FrmMain : Form
    {
        public FrmMain()
        {
            InitializeComponent();
        }


        private void btnExe1_Click(object sender, EventArgs e)
        {
            this.lblCount1.Text = ExectueTask1(10).ToString();
            this.lblCount2.Text = ExectueTask2(10).ToString();
        }



        //2.根據委托定義實現的方法
        private int ExectueTask1(int num)
        {
            System.Threading.Thread.Sleep(5000);//延遲5秒
            return num * num;
        }

        private int ExectueTask2(int num)
        {
            return num * num;
        }
        private void btnExe2_Click(object sender, EventArgs e)
        {
            MyCalculator objMyCal = ExectueTask1; //創建委托變量,代表方法1

            //通過委托異步調用方法
            //委托類型的 BeginInvoke(<輸入和輸出參數>,AsyncCallback callback,object asyncState)方法:異步調用的核心
            //第一個方法10,表示委托對應的實參
            //第二個參數callback:回調函數,表示異步調用後自動調用的函數
            //第三個參數asyncState,用於向回調函數提供參數信息
            //返回值 IAsyncResult-->異步操作狀態接口,封住了異步執行的參數


            //異步調用任務
            IAsyncResult result = objMyCal.BeginInvoke(10,null,null);
            this.lblCount1.Text = "正在計算請稍等。。。";


            //同步執行其他任務
            this.lblCount2.Text = ExectueTask2(10).ToString();

            //獲取異步執行的結果
            int res = objMyCal.EndInvoke(result);
            //委托類型的EndInvoke() 方法:借助於IAsyncResult接口對象,不斷的查詢異步調用是否結束
            //該方法知道異步調用的方法所有參數,所以,異步調用完畢後,取出異步調用的結果作為返回值
            this.lblCount1.Text = res.ToString();
        }
       

        //1.定義一個委托
        public delegate int MyCalculator(int num);
    }

異步委托:

 public partial class FrmMain : Form
    {
        public FrmMain()
        {
            InitializeComponent();
            //初始化委托變量
            this.objMyCal = new MyCalculator(ExecuteTask);

            //Lambda表達式
            //this.objMyCal = (num, ms) =>
            //    {
            //        System.Threading.Thread.Sleep(ms);
            //        return num * num;
            //    };
        }
        //1.聲明一個委托  延遲的秒數
        public delegate int MyCalculator(int num, int ms); //延遲的秒數

        //2.根據委托定義方法:返回一個數的平方
        private int ExecuteTask(int num, int ms)
        {
            System.Threading.Thread.Sleep(ms);
            return num * num;
        }

        //3.創建委托變量
        MyCalculator objMyCal = null;


        //同時執行多個任務
        private void btnExec_Click(object sender, EventArgs e)
        {
           
            //產生10個任務
            for (int i = 1; i < 11; i++)
            {
                //開始異步執行,並封裝異步函數
                objMyCal.BeginInvoke(10 * i, 1000 * i, MyCallBack, i);
                //最後一個參數i給回調函數AsyncState賦值,這個字段是object類型,如果數據很多,可以傳遞集合或者類和結構
            }
        }

        //5.編寫回調函數
        private void MyCallBack(IAsyncResult result)
        {
          int res=  objMyCal.EndInvoke(result);
            
            //異步顯示結果形式:第一個的計算結果:100
          Console.WriteLine("第{0}個計算結果:{1}",result.AsyncState.ToString(),res);
        }
        //異步編程總結
        //1.異步編程是建立在委托基礎上的編程方法
        //2.異步調用的每個方法都是在獨立的線程上執行的。因此,本質上就是一種多線程程序,也可以說是一個“簡化的多線程技術”
        //3.比較適合在後臺運行較為耗時間的《簡單任務》,並且要求任務之間是獨立的,任務中不要有直接訪問可視化控件的內容。
        //4.如果後臺任務要求必須按照特定順序執行,或者訪問到特定的共享資源,異步編程不太適合,而應該選擇多線程開發技術   
    }

異步委托