后台工作人员Ping

本文关键字:Ping 工作人员 后台 | 更新日期: 2023-09-27 17:49:34

  • 问题:Ping脱机设备需要10-15秒。

  • 目标:如果ping或后台工作程序运行时间超过5秒,我想结束/杀死/停止后台工作程序。有什么建议我该怎么做吗?

目前,当我ping一台在线设备时,它会在第一秒内回复。

private void backgroundWorkerPing_DoWork(object sender, DoWorkEventArgs e)
{
    string pcName = e.Argument.ToString();
    lblIPAddress.Invoke((Action)(() => lblIPAddress.ForeColor = Color.Black));
    lblStatus.GetCurrentParent().Invoke((Action)(() => lblStatus.Text = String.Format("Pinging {0}", pcName)));                
    string ipAddress = GetSinglePing(pcName);                       
    e.Result = ipAddress;
}
private string GetSinglePing(string pcName)
{
    Network net = new Network();
    return net.Pinger(pcName);
}
public class Network
{
    //My Ping Method
    public string Pinger(string pcName, int bufferSize = 32)
    {
        Ping ping = new Ping();
        byte[] buffer = new byte[bufferSize];
        PingOptions pingOpt = new PingOptions(64, true);            
        try
        {
            PingReply pingReply = ping.Send(pcName, 100, buffer, pingOpt);
            if (pingReply.Status == IPStatus.Success)
            {
                return pingReply.Address.ToString();
            }
            else
            {
                return "Offline";
            }
        }
        catch
        {
            return "Offline";
        }
    }            
}

后台工作人员Ping

再次编辑:

正如我之前的"编辑"中所说,您的代码中已经设置了ping超时。所以你的手术真的不应该延迟5…15秒。也许问题出在别的地方?

例如,以下面的代码(简单控制台应用程序(为例,它迭代IP列表,然后以IP - STATE - TIME USED 的格式显示每个IP的ping结果

public class Program
{
    private static void Main(string[] args)
    {
        var p = new Program();
        p.PingPong();
        Console.ReadLine();
    }
    private void PingPong()
    {
         var ips = new List<string>()
            {
                "43.128.240.28",
                "159.203.123.166",
                ... 30 in total in this test ...
                "201.131.43.87",
                "108.232.183.145"
            };
        foreach (var ip in ips)
        {
            string ip1 = ip;
            Task.Factory.StartNew(async () =>
                {
                    var newtwork = new Network();
                    var start = DateTime.Now;
                    string ping = newtwork.Pinger(ip1);
                    Console.WriteLine("{0} - {1} - {2}ms", ip, ping, (DateTime.Now - start).TotalMilliseconds);
                });
        }
    }
}

或多或少输出以下内容。

75.146.125.27 - Offline - 998.0982ms
190.37.198.208 - Offline - 978.329ms
90.82.250.179 - Offline - 975.3303ms
141.231.190.96 - Offline - 998.3851ms
38.89.231.171 - Offline - 976.3265ms
183.179.51.148 - Offline - 999.1762ms
125.238.115.199 - Offline - 977.1139ms
201.131.43.87 - Offline - 975.1229ms
154.165.188.89 - Offline - 978.1232ms
86.8.40.161 - Offline - 979.1236ms
108.232.183.145 - Offline - 998.6617ms

没有一个请求的时间超过一(1(秒,这是我自己设置的超时时间。

所以答案是:将每个请求作为新任务启动,并一起放弃后台工作程序,将ping超时设置为您实际需要的级别,并在需要时使用.BeginInvoke((将响应委托回UI线程(而不是Invoke(。

希望这能帮助你前进!

编辑:

好的,我看你已经把timeout设置为100ms了,所以应该不会花很长时间。但随后您会执行以下操作:

PingReply pingReply;
do
{
    pingReply = ping.Send(pcName, 100, buffer, pingOpt);                    
}
while(pingReply.Status != IPStatus.Success);
return pingReply.Address.ToString();    

它能帮你摆脱那里的循环吗?


也许你可以将所有的ping作为单独的任务来启动,并让它们根据需要生存多久?

Task.Factory.StartNew(() => Pinger("pcName"));
using System.Net.NetworkInformation;
Ping pingSender = new Ping ();
        PingOptions options = new PingOptions ();
        options.DontFragment = true;
        string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
        byte[] buffer = Encoding.ASCII.GetBytes (data);
        int timeout = 1000; //to timeout after 1s
        PingReply reply = pingSender.Send (args[0], timeout, buffer, options);
        if (reply.Status == IPStatus.Success)
        {
            Console.WriteLine ("Address: {0}", reply.Address.ToString ());
            Console.WriteLine ("RoundTrip time: {0}", reply.RoundtripTime);
            Console.WriteLine ("Time to live: {0}", reply.Options.Ttl);
            Console.WriteLine ("Don't fragment: {0}", reply.Options.DontFragment);
            Console.WriteLine ("Buffer size: {0}", reply.Buffer.Length);
        }

中的更多示例http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping(v=vs.110(.aspx