網絡應用程序的一般都會或多或少的使用到線程,甚至可以說,一個功能稍微強大的網絡應用程序總會在其中開出或多或少的線程,如果應用程序中開出的線程數目大於二個,那麼就可以把這個程序稱之為多線程應用程序。那麼為什麼在網絡應用程序總會和線程交纏在一起呢?這是因為網絡應用程序在執行的時候,會遇到很多意想不到的問題,其中最常見的是網絡阻塞和網絡等待等。
程序在處理這些問題的時候往往需要花費很多的時間,如果不使用線程,則程序在執行時的就會表現出如運行速度慢,執行時間長,容易出現錯誤、反應遲鈍等問題。而如果把這些可能造成大量占用程序執行時間的過程放在線程中處理,就往往能夠大大提高應用程序的運行效率和性能和獲得更優良的可伸縮性。那麼這是否就意味著應該在網絡應用程序中廣泛的使用線程呢?情況並非如此,線程其實是一把雙刃劍,如果不分場合,在不需要使用的地方強行使用就可能會產生許多程序垃圾,或者在程序結束後,由於沒有能夠銷毀創建的進程而導致應用程序掛起等問題。
所以如果你認為自己編寫的代碼足夠快,那我給你的建議還是別使用線程或多線程。這裡要提醒諸位的是如果您對在Windows下的線程和其執行原理和機制還不十分清楚,可以先參閱一下介紹Windows操作系統方面的書籍,它們一般都會對其進行比較詳細的闡述。然後再閱讀本文。
一.簡介在Visual C#中創建和使用線程:
Visual C#中使用的線程都是通過自命名空間System.Threading中的Thread類經常實例化完成的。通過Thread類的構造函數來創建可供Visual C#使用的線程,通過Thread中的方法和屬性來設定線程屬性和控制線程的狀態。以下Thread類中的最典型的構造函數語法,在Visual C#中一般使用這個構造函數來創建、初始化Thread實例。
public Thread (
ThreadStart start
) ;
參數
start ThreadStart 委托,它將引用此線程開始執行時要調用的方法。
Thread還提供了其他的構造函數來創建線程,這裡就不一一介紹了。表01是Thread類中的一些常用的方法及其簡要說明:
方法 說明 Abort 調用此方法通常會終止線程,但會引起ThreadAbortException類型異常。 Interrupt 中斷處於WaitSleepJoin 線程狀態的線程。 Join 阻塞調用線程,直到某個線程終止時為止。 ResetAbort 取消當前線程調用的Abor方法。 Resume 繼續已掛起的線程。 Sleep 當前線程阻塞指定的毫秒數。 Start 操作系統將當前實例的狀態更改為ThreadState.Running。 Suspend 掛起線程,或者如果線程已掛起,則不起作用。 表01:Thread類的常用方法及其說明這裡要注意的是在.Net中執行一個線程,當線程執行完畢後,一般會自動銷毀。如果線程沒有自動銷毀可通過Thread中的Abort方法來手動銷毀,但同樣要注意的是如果線程中使用的資源沒有完全銷毀,Abort方法執行後,也不能保證線程被銷毀。在Thread類中還提供了一些屬性用以設定和獲取創建的Thread實例屬性,表02中是Thread類的一些常用屬性及其說明:
屬性 說明 CurrentCulture 獲取或設置當前線程的區域性。 CurrentThread 獲取當前正在運行的線程。 IsAlive 獲取一個值,該值指示當前線程的執行狀態。 IsBackground 獲取或設置一個值,該值指示某個線程是否為後台線程。 Name 獲取或設置線程的名稱。 Priority 獲取或設置一個值,該值指示線程的調度優先級。 ThreadState 獲取一個值,該值包含當前線程的狀態。 表02:Thread類的常用屬性及其說明二.本文的主要內容及程序調試和運行環境:
本文的主要內容是介紹多線程給用Visual C#編寫網絡應用程序帶來的更高性能提高。具體的做法是在Visual C#用二種不同的方法,一種采用了多線程,另一種不是,來實現同一個具體網絡應用示例,此示例的功能是獲取網絡同一網段多個IP地址對應的計算機的在線狀態和對應的計算機名稱,通過比較這二種方法的不同執行效率就可知多線程對提高網絡應用程序的執行效率是多麼的重要了。以下是本文中設計到程序的調試和運行的基本環境配置:
(1).微軟公司視窗2000服務器版。
(2).Visual Studio .Net 2002正式版,.Net FrameWork SDK版本號3705。