多线程操作(循环往listbox中添加数据)
来自:https://www.cnblogs.com/lk-kk/p/4617012.html
一、先造一个窗体,其中就开始按钮,暂停按钮,以及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; } } }
三、点暂停按钮的时候停止添加数据