后台工作人员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超时。所以你的手术真的不应该延迟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