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

Posted gisoracle

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程操作(循环往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;
        }
    }
}
复制代码

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

以上是关于多线程操作(循环往listbox中添加数据)的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程与并发库4.传统线程同步通信技术

HashMap为啥不安全?

1.1多线程上下文切换

多线程与进程

多线程的底层原理是怎么样的?

多线程