一、先造一個窗體,其中就開始按鈕,暫停按鈕,以及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; } } }
三、點暫停按鈕的時候停止添加數據