委托和线程的一个小例子

以前一直对线程和委托只知其一;不知其二,上网看了一些相关资料,本身尝试写一个小的程序来试试。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++; } } }

 

相关文章
相关标签/搜索