在修改成多線程程序之前,必須面對並解決下面幾個問題:
1. 線程是無返回值的,所以在線程中處理、調用的應是一個過程,所以要把掃描IP地址對應的計算機的代碼給包裝成一個過程。
2. 放在線程中處理的過程,因為沒有返回值,從而無法向主程序(進程)傳遞數值。但掃描IP地址對應的計算機的過程卻要向主程序(進程)傳遞IP地址是否在線的數據,所以在修改成多線程程序之前,必須從線程往主程序(進程)傳遞數據的問題。
下面是在【掃描網絡計算機】項目的基礎上,把它修改成基於多線程程序的具體實現步驟:
1. 由於程序中使用到線程,所以在Form1.cs代碼首部,導入命名空間代碼區中加入下列代碼,下列代碼是導入Thread類所在的命名空間。
using System.Threading ;
2. 在Form1.cs代碼的namespace代碼區加入下列語句,下列語句是定義一個delegate:
public delegate void UpdateList ( string sIP , string sHostName ) ;
3. 在Form1.cs中的定義Form1的class代碼區定義加入下列代碼,下列代碼是定義一個變量,用以存放程序執行的時間:
private System.DateTime StartTime ;
4. 在Form1.cs代碼的Main函數之後,添加下列代碼,下列代碼是創建一個名稱為ping的Class,這個Class能夠通過其設定的屬性接收給定的IP地址字符串,並據此來判斷此IP地址字符串對應的計算機是否在線,並通過其設定的HostName屬性接收從線程傳遞來的數據。
public class ping
{
public UpdateList ul ;
public string ip ;
//定義一個變量,用以接收傳送來的IP地址字符串
public string HostName ;
//定義一個變量,用以向主進展傳遞對應IP地址是否在線數據
public void scan ( )
{
IPAddress myIP = IPAddress.Parse ( ip ) ;
try
{
IPHostEntry myHost = Dns.GetHostByAddress ( myIP );
HostName = myHost.HostName.ToString ( ) ;
}
catch
{
HostName = "" ;
}
if (HostName == "")
HostName = " 主機沒有響應!";
if ( ul != null)
ul ( ip , HostName ) ;
}
//定義一個過程(也可以看出為方法),用以判斷傳送來的IP地址對應計算機是否在線
}
5. 在Form1.cs中添加完上述代碼後,再添加下列代碼:
void UpdateMyList ( string sIP , string sHostName )
{
lock ( listBox1 )
{
listBox1.Items.Add ( sIP + " " + sHostName ) ;
if ( progressBar1.Value != progressBar1.Maximum )
{
progressBar1.Value++ ;
}
if ( progressBar1.Value == progressBar1.Maximum )
{
MessageBox.Show ( "成功完成檢測!" , "提示" ) ;
DateTime EndTime = DateTime.Now ;
TimeSpan ts = EndTime-StartTime ;
label4.Text = ts.Seconds.ToString ( ) + "秒" ;
//顯示掃描計算機所需要的時間
progressBar1.Value = progressBar1.Minimum ;
}
}
}