多线程操作(循环往listbox中添加数据)

一、先造一个窗体,其中就开始按钮,暂停按钮,以及listbox文本框

 

二、当点击开始的时候,数据会无限的往listbox中加,为了防止卡住和提升效率,便造了一个新的线程来执行开始操作

namespace 线程Again
{
    //首先要定义一个委托(委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递)
    public delegate void Weituo();//利用这个委托来用方法调用方法
    public partial class Form1 : Form
    {
        //定义好了委托,开始定义一个线程;
        private Thread therad;
        //定义一个bool型的变量来存储是开始还是暂停
        private bool isok=true;
        //定义一个常量
        private long i;
        public Form1()
        {
            InitializeComponent();
            //Control.CheckForIllegalCrossThreadCalls = false;//不要检查安全性(一般不用这句),如果有这句便不需要委托了
        }

        private void button1_Click(object sender, EventArgs e)//开始按钮
        {
            button1.Enabled = false;
            //当点击开始的时候,将数据一条条的添加到listbox1中,点暂停便会终止,因为是循环添加数据,一旦点开始变不会停下来,所以这便需要多线程操作,开始按钮有自己单独的线程

            //首先将线程实例化出一个
            therad = new Thread(new ThreadStart(Start)); //为button1按钮造一个新的线程,这样点button1的话,就会运行新造的这个线程,而不会影响到窗体的主线程
            therad.IsBackground = true;//确认新造的线程后台运行
            therad.Start();

        }


        //定义一个Start函数,用来循环放数据
        public void Start()
        {
            while (isok)//循环调用委托,改控件属性这个工作交给委托来做
            {
                //在循环里调用委托函数
                weituo();
                
            }
        }

        //定义一个委托函数
        public void weituo()
        {

            //判断一下新造的(button1)线程来访问listbox1这个控件的listBox1.InvokeRequired属性是true还是false;如果是其他的线程来访问自己的线程,则返回值是ture
            if(listBox1.InvokeRequired)
            {
                //因为是其他的线程来访问自己的线程,所以返回值是true,既然是其他的线程来访问,为了安全,必须转回到自己的线程,这就用到了委托
                Weituo x = new Weituo(weituo);//将weituo函数变成新造的线程能够调用的
                this.Invoke(x);//在拥有button1控件的窗体上执行这个委托
            }
            else
            {   
                listBox1.Items.Insert(0,i);//一旦返回值是false,便将数据添到listbox1中
                i++;
            }

        }

        private void button2_Click(object sender, EventArgs e)
        {
            isok = false;
            button1.Enabled = true;
        }
    }
}

三、点暂停按钮的时候停止添加数据

 

posted @ 2015-07-02 19:43  XCml  阅读(4237)  评论(0编辑  收藏  举报