3

我有IP地址的數據表中的大名單,我有這麼快ping通他們, 我用這個代碼:ping IP地址的大名單的最快方法是什麼?

public bool PingIP(string IP) 
{ 
    bool result = false; 
    try 
    {     
     Ping ping = new Ping(); 
     PingReply pingReply = ping.Send(IP); 
     if (pingReply.Status == IPStatus.Success) 
      result = true; 
    } 
    catch 
    { 
     result = false; 
    } 
    return result; 
} 

然後我把它在while循環:

private void CheckNetworkState() 
{ 
    while (rowindexping > -1) 
    { 
     if (rowindexping == tbl_ClientInfo.Rows.Count) 
     { 
      rowindexping = -1; 
      return; 
     } 

     string ip = tbl_ClientInfo.Rows[rowindexping]["clientip"].ToString(); 
     if (!PingIP(ip)) 
     { 
      do something 
     } 
     rowindexping++; 
     Thread.Sleep(100); 
    } 
} 

因爲我想在我的項目的背景我調用類的線程來完成這項工作:

threadping = new Thread(CheckNetworkState);    
threadping.IsBackground = true; 
threadping.Start(); 

我的問題是,它需要這麼多的時間,並沒有在後臺工作。我的意思是系統正忙,直到tbl_clientinfo中的所有IP地址都通過ping類。 我想讓系統檢查所有行,因爲我正在處理我的項目的其他部分。

我做得對嗎?

+4

平是不會要快。最糟糕的情況是,每個ping數據包都會被忽略/丟失/丟失,您必須等待每次ping測試的超時時間。爲了使這個「快速」,你需要同時發射多個ping。 –

+0

ping的速度不是來自代碼的百分之百,它直到通信和網絡 –

+0

您可以使用ServerToPing []並創建多個並行工作的線程。然後,你可以使用並行庫或類似的信號量來運行和規則線程... – Marco

回答

0

我會做的是在後臺運行一個單獨的多線程守護進程,執行ping操作並將結果放入數據庫中。有一個頁面稍後通過AJAX加載結果。

3

您的代碼正在單線程上運行所有代碼;你沒有使用多個線程。另外,你爲什麼在那裏有Thread.Sleep

嘗試以下操作:

  1. 查詢數據庫並獲得all的IP地址
  2. 在一個循環中,旋轉了一個新的線程將運行PingIP每個 IP地址

注意:您也可以在每次從數據庫獲得新行時啓動一個新線程

示例:

static void Main(string[] args) 
    { 
     // get the IPs from the database so you can iterate over them 
     List<string> ips = new List<string>() 
     { 
      "google.com", 
      "127.0.0.1", 
      "stackoverflow.com" 
     }; 

     foreach (var ip in ips) 
     { 
      // See http://stackoverflow.com/questions/4744630/unexpected-behaviour-for-threadpool-queueuserworkitem 
      // for reason to use another variable in the loop 
      string loopIp = ip; 
      WaitCallback func = delegate(object state) 
      { 
       if (PingIP(loopIp)) 
       { 
        Console.WriteLine("Ping Success"); 
       } 
       else 
       { 
        Console.WriteLine("Ping Failed"); 
       } 
      }; 
      ThreadPool.QueueUserWorkItem(func); 
     } 

     Console.ReadLine(); 
    } 

    public static bool PingIP(string IP) 
    { 
     bool result = false; 
     try 
     { 
      Ping ping = new Ping(); 
      PingReply pingReply = ping.Send(IP); 

      if (pingReply.Status == IPStatus.Success) 
       result = true; 
     } 
     catch 
     { 
      result = false; 
     } 

     return result; 
    } 
+0

Thanx for u'r reply。但我的問題仍然存在。爲什麼我的線程不能在後臺工作。整個項目一直下到名單完成ping!當線程完成其工作時,它不工作嗎? –

+0

@maryammohammadi - 你是什麼意思項目是失敗?看看我的例子,你應該能夠在foreach循環之後運行你想要的任何代碼,並且ping會在不同的線程上發生。 – Omar

+0

@Omar,我怎樣才能更新每個'label.Text'?我有一個在UI上的IP地址列表。 – Badiparmagi

0

考慮對fping實用程序進行系統調用。當然,這不是託管代碼,但fping針對您的特定任務進行了很好的優化,並將問題簡化爲一次調用,然後處理基於文本的結果列表。

-1

您可以使用PowerShell

private string resultat(string s) 
{ 
    Runspace space = RunspaceFactory.CreateRunspace(); 
    space.Open(); 

    Pipeline pipeline = space.CreatePipeline(); 
    pipeline.Commands.AddScript(s); 
    pipeline.Commands.Add("Out-String"); 
    Collection<PSObject> results = pipeline.Invoke(); 

    StringBuilder stringBuilder = new StringBuilder(); 
    foreach (PSObject obj in results) 
    { 
     stringBuilder.AppendLine(obj.ToString()); 
    } 

    return stringBuilder.ToString(); 
} 

然後用resultat("ping -l 10 -n 2 " + your_ip);

相關問題