異步委托
阿新 • • 發佈:2017-07-14
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.如果後臺任務要求必須按照特定順序執行,或者訪問到特定的共享資源,異步編程不太適合,而應該選擇多線程開發技術 }
異步委托