我有一个Winform,它可以ping用户选择的IP地址范围。 ping的答案根据IP地址写在不同的richTextBox中。
我可以选择一次ping几个范围的ping。例如我将x.x.1.1 ping到x.x.1.10;然后在第二次我将x.x.2.1 ping至x.x.2.10。前10个IP地址将写入10 richTextBox;那么将在另外10个richTextBox中写入第10个IP地址。
我的问题:当我ping 10秒IP地址时,我的程序至少需要3秒钟才能使ping出现在richTextBoxs中。 (如果出现了..)
如果我打开10个程序并ping 1 ping范围就可以了。但是,如果我打开1个程序来ping 2个IP地址范围,那么它将不起作用。
现在输入代码:
-用户选择IP地址范围。 (比如说x.x.x.1到x.x.x.10)
Thread th1 = new Thread(() => runPing(1, 1));
th1.Start();
Thread th2 = new Thread(() => runPing(2, 1));
th2.Start();
.
.
Thread th10 = new Thread(() => runPing(10, 1));
th10.Start();
//当它是第二个IP范围时,它是=> runPing(x, 2 )
public void runPing(object ip, int nbAdd)
{
string command = "/c ping -t x.x.x."+ ip;
ProcessStartInfo procStartInfo = new ProcessStartInfo("CMD.exe", command);
Process proc = new Process();
proc.StartInfo = procStartInfo;
//some procStartInfo
proc.Start();
proc.OutputDataReceived += new DataReceivedEventHandler((sender, e) => proc_OutputDataReceived(sender, e, ip, nbAdd)); //I add parameters because i will need them later
proc.BeginOutputReadLine();
}
void proc_OutputDataReceived(object sender, DataReceivedEventArgs e, object ip, int nbAdd)
{
//read the ouput and put the ping in a int named ping
switch(nbAdd)
{
case 1:
switch(ip)
{
case 1:
MethodInvoker append1 = () => richTextBox1.Text += ping.ToString() + " ms \n";
richTextBox1.BeginInvoke(append1);
richTextBox1.TextChanged += new EventHandler((s, ev) => richTextBox_TextChangedPing(s, ev, nb, ping, numAdd)); //not sure if it's relevant but every time the ping change I make some changement in the WinForm (like label colors...)
break;
.
.
case 10:
}
case 2:
//second range of ping with another switch(ip)
}
x.x.1.1是用richTextBox1编写的。 x.x.1.2是用richTextBox2编写的。 x.x.2.1是用richTextBox21 ....
是的,我知道,我的代码是安静的冗余代码(我为向您展示它感到羞愧),但现在还可以,并且可以正常工作。正如我所说,我想解决第二个IP地址范围的延迟问题。
有时它可以用于richTextBox的一部分,有时仅在刷新后才可以使用,有时ping会在5秒钟后将所有内容ping一次写入richTextBox。
在功能更强大的CPU(?)中似乎延迟更短了
好吧,我试图找到一种解决方案,但是当您不知道问题出在哪里时,它就很难解决。
感谢您到目前为止的阅读。