我在数据表中有大量的IP地址,我必须快速ping它们, 我用了这段代码:
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类。 我希望系统检查所有行,因为我正在使用我的项目的其他部分。
我做得对吗?
答案 0 :(得分:2)
您的代码在单个线程上运行所有代码;你没有使用多个线程。另外,为什么你有Thread.Sleep
?
尝试以下方法:
all
IP PingIP
注意:每次从数据库中获取新行时,您也可以启动新线程
样品:
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;
}
答案 1 :(得分:0)
我要做的是在后台运行一个单独的多线程守护进程,执行ping操作,并将结果放在数据库中。有一个页面可以在以后通过AJAX加载结果。
答案 2 :(得分:0)
考虑对fping实用程序进行系统调用。当然,它不是托管代码,但fping已针对您的特定任务进行了优化,并将您的问题简化为单个调用,然后处理基于文本的结果列表。
答案 3 :(得分:0)
你可以使用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);