線程實現兩個lable標簽顯示:
public partial class FrmThreadControl : Form { public FrmThreadControl() { InitializeComponent(); } private void btnExecute1_Click(object sender, EventArgs e) { int a = 0; Thread objThread1 = new Thread(delegate() { for (int i = 1; i <= 20; i++) { a += i; if (this.lblResult1.InvokeRequired)//判斷是否調用Invoke方法 { this.lblResult1.Invoke(new Action<string>(s => { this.lblResult1.Text = s; }), a.ToString()); } Thread.Sleep(200); } }); objThread1.IsBackground = true;//設置為后台線程(通常都要這樣設置) objThread1.Start(); } private void btnExecute2_Click(object sender, EventArgs e) { int a = 0; Thread objThread2 = new Thread(() => { for (int i = 1; i <= 50; i++) { a += i; if (this.lblResult2.InvokeRequired)//判斷是否調用Invoke方法 { this.lblResult2.Invoke(new Action<string>(s => { this.lblResult2.Text = s; }), a.ToString()); } Thread.Sleep(100); } }); objThread2.IsBackground = true; objThread2.Start(); } }
異步實現計算方法:
public partial class FrmCalllBack : Form { public FrmCalllBack() { InitializeComponent(); //【3】初始化委托變量 // this.objMyCal = new MyCalculator(ExecuteTask); //也可以直接使用Lambda表達式 this.objMyCal = (num, ms) => { System.Threading.Thread.Sleep(ms); return num * num; }; } //【3】創建委托變量(因為異步函數和回調函數都要用,所以定義成成員變量) private MyCalculator objMyCal = null; //【4】同時執行多個任務 private void btnExec_Click(object sender, EventArgs e) { //發布任務 for (int i = 1; i < 11; i++) { //開始異步執行 objMyCal.BeginInvoke(10 * i, 1000 * i, MyCallBack, i); //最后一個參數i給回調函數的字段AsyncState賦值,如果數據很多可以定義成類或結構 } } //【5】回調函數 private void MyCallBack(IAsyncResult result) { int res = objMyCal.EndInvoke(result); //顯示異步調用結果:result.AsyncState字段用來封裝回調函數自定義參數,object類型 Console.WriteLine("第{0}個計算結果為:{1}", result.AsyncState.ToString(), res); } //【2】根據委托定義一個方法:返回一個數的平方 private int ExecuteTask(int num, int ms) { System.Threading.Thread.Sleep(ms); return num * num; } //【1】聲明委托 private delegate int MyCalculator(int num, int ms); } //異步編程的總結: //1. 異步編程是建立在委托的基礎上一種編程的方法。 //2. 異步調用的每個方法都是在獨立的線程中執行的。因此,本質上就是一種多線程程序,是簡化的多線程。 //3. 比較適合在后台運行較為耗時的《簡單任務》,並且任務之間要求相互獨立,任務中不應該有直接訪問可視化控件大代碼。 //4. 如果后台任務要求必須按照特定順序執行,或者訪問共享資源,則異步編程不太適合,應選擇多線程開發技術。 }
多線程Thread的基礎使用:
public partial class FrmThead : Form { public FrmThead() { InitializeComponent(); } //執行任務1 private void btnExecute1_Click(object sender, EventArgs e) { int a = 0; //ThreadStart 委托定義:public delegate void ThreadStart() Thread objThread1 = new Thread(delegate() { for (int i = 1; i <= 20; i++) { a += i; Console.WriteLine(a + " "); Thread.Sleep(500); } }); objThread1.IsBackground = true;//設置為后台線程(通常都要這樣設置) objThread1.Start(); } //執行任務2 private void btnExecute2_Click(object sender, EventArgs e) { Thread objThread2 = new Thread(() => { for (int i = 1; i <= 50; i++) { Console.WriteLine("---------------a" + i + "----------------"); Thread.Sleep(100); } }); objThread2.IsBackground = true;//設置為后台線程(通常都要這樣設置) objThread2.Start(); } } }