多線程操作(循環往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;
        }
    }
}

三、點暫停按鈕的時候停止添加數據

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM