C#中多執行緒 委託的使用

weixin_34293059發表於2013-08-30
背景: 
什麼是多執行緒?我們在建立以個C#專案時,往往會在Form1上新增控制元件,然後寫程式碼,初
學者都是在重複這個過程,其實這個過程是單執行緒的,可以理解為只有“main”主執行緒,有
的時候往往需要同時測量多個東西,比如說在掃面區域網主機時,如果按一個一個主機的IP
去掃描,會很浪費時間,因為當一個主機未開機,會對這個主機等待一直到超時。如果建立
多個執行緒,讓所有的IP 掃描分配給不同的執行緒去執行,因此會節省很多時間,尤其是掃面
的IP段主機大部分沒開機,和單執行緒比花費的時間差很多。 
 
 
因為我也是初學者,談的很膚淺,關於程式、執行緒的概念還是去看高手的理解吧。不過有一
點,多執行緒未必會比單執行緒節省時間,上面的例子是節省時間的例子之一,但並不是說所有
多執行緒的程式比單執行緒程式節省時間。這要分情況看。 
 
下面說一下怎麼使用多執行緒。(將在後面附有例子) 
第一步:在主程式前加上using system.threading 
第二部:執行緒例項化,一般是在主程式最前端宣告thread    thread1; 
第三部:在呼叫執行緒的方法中給執行緒分配記憶體,準備啟動執行緒  thread1=  new  thread(方法
名)方法名指的是執行緒的入口,即要執行的方法。然後啟動執行緒:thread1.start(); 
第四步:終止執行緒 
終止執行緒有兩種方法,一種是使用建立公共布林型別,線上程內部時刻檢查布林值,通過在
外界改變布林型別的值,來控制執行緒的結束。 
第二種是強制退出執行緒,即呼叫thread1..abort();與此方法連用的是thread1.join();為什麼要
連用呢?因為雖然執行緒強制退出,但是並不知道執行緒終止的具體時間,所以把強制退出的線
程合併到主執行緒中來。值得注意的是執行緒強制退出後不能夠用thread1.Resume()重啟執行緒。
所以強制執行緒退出的方法慎用。 
 
什麼是委託呢?舉一個最實用的例子,剛才是不是已經知道建立多執行緒了,但是自己建立的
執行緒時不能訪問其他執行緒的東西,比如說自己建立的執行緒是不能訪問窗體上的任何控制元件,但
是自己建立的執行緒很想用到窗體中的控制元件怎麼呢?那就用委託吧。委託時系統專門用作協調
執行緒之間的關係的。 
委託的定義 
Delegate  (返回值型別)delegatename(委託名稱)(引數列表) 
例子:delegate void list(); 
    Delegate string name(string s); 
委託例項化 
list list1; 
list1=new list(方法名); 
 
呼叫委託 
此時委託list1 將作為呼叫委託的方法的一個引數。如listBox1.Invoke(list1); 
下面是一個涉及執行緒和委託綜合的小例子。

using System; 
using System.ComponentModel; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 
using System.Threading;//使用多執行緒的宣告(準確的說是要在main主執行緒中建立新的執行緒時要進行的引
    public partial class Form1 : Form 
        public static int Num = 0; 
        Thread thread1; //在主執行緒中宣告執行緒1 
        Thread thread2; //在主執行緒中宣告執行緒2 
        daililist list1;//委託例項化,即建立委託對應的事件 
            InitializeComponent(); 
            list1 = new daililist(updatelist);//委託處理的方法,這裡updatelist是一個方法,這個句子的意思是把updatelist這個方法交給了list1這個委託例項 
            thread1 = new Thread(numadd ); 

            thread1.Start(); 
            thread2.Start(); 
        public void updatelist() 
            listBox1.Items.Add (Num) ; 
        public void numadd() 
            Num ++; 
listBox1.Invoke(list1);//這是自己建立的執行緒要呼叫的方法,但是listbox1是main主執行緒建立的控制元件,自定義的執行緒無法直接訪問,上面已經定義了委託,此處應用listbox1的invoke 
//到此我們理一下思路,建立執行緒thread1、thread2,這兩個執行緒都指向了numadd這個方法,首先都執行Num++,然後執行listBox1.Invoke(list1),意思是說將要對listbox1操作, 
        private void button2_Click(object sender, EventArgs e) 
            thread1.Join(); 
            thread2.Abort(); 
        } 
    } 
}


using System.Collections.Generic; 
using System.Data; 
using System.Linq; 
用說明) 
 
namespace mytest 
{ 
     
    { 
        delegate void daililist();//主執行緒之外的執行緒要呼叫main執行緒中建立的控制元件,需要使用委託的方式,此處是委託的定義 
        public Form1() 
        { 
        } 
 
        private void button1_Click(object sender, EventArgs e) 
        { 
            thread2 = new Thread(numadd); 
 
        } 
        { 
        } 
        { 
//方法把所有對listbox1的操作都交給委託list1去處理。 
//但是具體操作在list1這個委託當中,然後這個委託指向了updatelist並執行,至此thread1、thread2都完成了對listbox1的操作! 
        } 
 
        { 
            thread1.Abort(); 
            thread2.Join(); 
         

相關文章