以前一直對線程和委託只知其一;不知其二,上網看了一些相關資料,本身嘗試寫一個小的程序來試試。this
首先咱們要的界面以下,要作的功能就是 按button1: label1從0開始往上不斷的刷新顯示、 按button2:label2從0開始往上不斷的刷新顯示。spa
代碼以下:線程
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading; using System.Threading.Tasks; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } //定義委託 private delegate void beginTimeClickCallBack(); //定義回調 private beginTimeClickCallBack beginClickCallBack; //定義委託 private delegate void beginTimeCLick2CallBack(); //定義回調 private beginTimeCLick2CallBack beginClick2CallBack; //建立線程 Thread t1; Thread t2; int i = 0; int j = 0; private void button1_Click(object sender, EventArgs e) { //啓動線程 t1 = new Thread(new ThreadStart(changemsg)); t1.Start(); } private void button2_Click(object sender, EventArgs e) { //啓動線程 t2 = new Thread(new ThreadStart(changemsg2)); t2.Start(); } //線程執行 private void changemsg() { //實例化回調 beginClickCallBack = new beginTimeClickCallBack(click1); while (true) { this.label1.Invoke(beginClickCallBack); Thread.Sleep(1000); i++; } } //線程執行 private void changemsg2() { //實例化回調 beginClick2CallBack = new beginTimeCLick2CallBack(click2); while (true) { this.label2.Invoke(beginClick2CallBack); Thread.Sleep(1000); j++; } } private void click2() { label2.Text = j.ToString(); } private void click1() { label1.Text = i.ToString(); } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { t1.Abort(); t2.Abort(); } } }
如上代碼: 屢次點擊butto後會發現時間變化頻率愈來愈快。 是因爲每次點擊button後又不斷的建立了新的thread,使用 lock 功能來鎖定:code
private void changemsg() { lock (this) { //實例化回調 beginClickCallBack = new beginTimeClickCallBack(click1); while (true) { this.label1.Invoke(beginClickCallBack); Thread.Sleep(1000); i++; } } }