同步編程
public partial class Form1 : Form { public Form1() { InitializeComponent(); } //同步執行 private void btnExcu_Click(object sender, EventArgs e) { lab1.Text = add(10,10).ToString(); lab2.Text = jianf(10, 10).ToString(); } private int add(int a,int b) { return a + b; } private int jianf(int a,int b) { //調用thread類中的Sleep()方法來給方法2延遲5000毫秒 System.Threading.Thread.Sleep(5000); return a * b; }
效果如下:
代碼分析:
當我點擊同步顯示的時候,由於方法2延遲了5000毫秒,所有label1和label2會等待5000毫秒后在一同顯示,其他的按鈕點之沒有反應。
異步顯示 public partial class Form1 : Form { //【1】定義委托 public delegate int adddelegate(int a,int b); public Form1() { InitializeComponent(); } //同步執行 private void btnExcu_Click(object sender, EventArgs e) { lab1.Text = add(10,10).ToString(); lab2.Text = jianf(10, 10).ToString(); } //【2】根據委托定義委托方法 private int add(int a,int b) { return a + b; } private int jianf(int a,int b) { //調用thread類中的Sleep()方法來給方法2延遲5000毫秒 System.Threading.Thread.Sleep(5000); return a * b; } //【3】異步調用 private void btnExcu2_Click(object sender, EventArgs e) { //通過委托異步調用方法 //委托類型的BeginInvoke(輸入和輸出變量) //第一個參數10 表示委托方法的實參。 //第二個參數Callback:回調函數,表示異步調用后自動調用的函數 //第三個參數AsyncState:用戶向回調函數提供參數信息 //返回值:IAsyncResult:異步操作狀態接口,封裝了異步執行的參數 //創建委托變量,並指向方法 adddelegate my = jianf; //異步調用任務 需要用到接口IAsyncResult IAsyncResult resul = my.BeginInvoke(10,10,null,null); this.lab1.Text = "正在計算,請稍等..."; //同時執行其他任務 this.lab2.Text = add(10,10).ToString(); //獲取異步執行的結果 EndInvoke返回一個int類型 參數是接口 //委托類型的EndInvoke()方法:借助於IAsyncResult接口對象,不斷的查詢異步調用是否結束。 int re= my.EndInvoke(resul); this.lab1.Text = re.ToString(); } }