gpt4 book ai didi

c# - 运行具有连续值返回的多个线程(ping 程序)

转载 作者:行者123 更新时间:2023-11-30 16:54:07 25 4
gpt4 key购买 nike

美好的一天

我已经开始了一个项目,作为基础需要在 cmd“ping x.x.x.x -t”中插入一个命令并且程序需要返回输出直到指定的参数

我正在考虑线程,因为我对多线程的理解有限,没有指导我无法继续

我的 ping 类接收字符串 ip,将其添加到预编译命令字符串等。

我知道用于此用途的内置 ping 类,但我更喜欢“更长”的方法,因为我将从中获得有值(value)的信息/经验

主要对象类:ping

class ping
{
Process proc;
ProcessStartInfo psi;
string ip_address;
bool bStop = false;

public ping(string ip)
{
ip_address = ip;
}

public void StartPing()
{
string cmdInput;
psi = new ProcessStartInfo(Environment.GetEnvironmentVariable("COMSPEC"));
psi.RedirectStandardInput = true;
psi.RedirectStandardOutput = true;

psi.UseShellExecute = false;
proc = Process.Start(psi);

proc.StandardInput.WriteLine("ping " + ip_address + " -t");

cmdInput = proc.StandardOutput.ReadLine();
cmdInput = proc.StandardOutput.ReadLine();
cmdInput = proc.StandardOutput.ReadLine();
cmdInput = proc.StandardOutput.ReadLine();
cmdInput = proc.StandardOutput.ReadLine();
cmdInput = proc.StandardOutput.ReadLine();
while (bStop == false)
{
cmdInput = proc.StandardOutput.ReadLine();
Console.WriteLine(returnPing(cmdInput));
}
proc.Close();
}

private string returnPing(string cmdInput)
{
int start, end;
string ping;
if (cmdInput.IndexOf("Reply") != -1 && cmdInput.IndexOf("time") != -1)
{
start = cmdInput.IndexOf("time=") + 5;
end = cmdInput.IndexOf("ms");
ping = cmdInput.Substring(start, end - start);
return ping;

}
else return "-1";
}

thread_handler 类,它管理ping 方法的多个实例,请不要使用console。writeline 是一个临时输出,我将在未来更改

class thread_handler
{
string[] ipList;
private IList<Thread> threadList;

public thread_handler(string[] ip)
{
ipList = ip;
threadList = new List<Thread>();
createThreads();
}

private void createThreads()
{
foreach (string item in ipList)
{
ping NewPing = new ping(item);
Thread newPingThread = new Thread(NewPing.StartPing);
newPingThread.IsBackground = true;
newPingThread.Name = string.Format("{0}", item);
threadList.Add(newPingThread);
}
startAllThreads();
}

private void startAllThreads()
{
foreach (Thread item in threadList)
{
item.Start();
}
}
}

程序

class Program
{
static string[] ipList;
static void Main(string[] args)
{
ipList = new String[3];
readData();
sendData();
}

private static void sendData()
{
thread_handler thIp = new thread_handler(ipList);
}

private static void readData()
{
//use sll with name defintions and ip address's with metadata
ipList[0] = "10.0.0.2";
ipList[1] = "telkom_exchange";
ipList[2] = "goo.gl";

}

这个程序的目的是(随着 future 的 gui 变化)一个简单的控制台,具有各自的维度,不断地 ping 某些 ip 地址(我们有禁止基础设施,因此程序是为了提供信息),不断更新每个 ping 回复

我不希望任何人完成这个程序,我只是需要帮助运行这个 ping 的多个实例(或者可能是“线程”),因此

每个线程在运行“StartPing()”方法时,应该返回一个输出,例如只需将 ping 输出到控制台,但它不会...

输出:

 The process tried to write to a nonexistent pipe. 
The process tried to write to a nonexistent pipe.

然后挂起

最佳答案

你从子进程读取的方式不对。这是一项异常复杂的任务。我不知道您为什么会收到此特定错误消息,但听起来它与流程标准输出重定向有关。例如,您没有重定向标准错误。

我建议您使用投票最多的堆栈溢出片段之一,可通过以下方式找到:site:stackoverflow.com process RedirectStandardOutput。有数百个这样的问题。大多数解决方案都有细微的错误。

This is a good checklist.

关于c# - 运行具有连续值返回的多个线程(ping 程序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30839145/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com