1. 程式人生 > >滴水穿石 C#中多線程 委托的使用

滴水穿石 C#中多線程 委托的使用

兩種方法 例子 圖片 強制 註意 event 檢查 water 過程

什麽是多線程?我們在建立以個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(); 

滴水穿石 C#中多線程 委托的使用