在 C# 的 foreach 循环中使用 ping

Using ping in a foreach loop in C#

我有一项涉及自动化的 C# 作业。我的代码主要基于我在网上找到的东西。我当前的问题是我试图从 CSV 文件逐行读取 IP 地址到数组中,对数组的每个对象执行 ping 操作,然后附加对象以便每个对象都将读取 "IP, status(if the ping was successful), response time"

我正在尝试使用 foreach 循环,但 运行 遇到了错误。我在 Mac 上,所以它使用的是单声道。任何帮助,将不胜感激。

(下面的完整作业如果有助于解释任何内容)

从预制的 C# 控制台应用程序开始,您的应用程序将在 运行ning 时允许三个命令 – 启动、停止和退出。应用程序将在第一次 运行ning 时要求用户提供 CSV 文件(用户必须提供 CSV 文件)。该文件将包含网址(每行 1 个)——教授将提供初始文件。 您的应用程序将设置一个计时器,以便每次计时器 运行s 时,它都会对提供的网址执行 ping 操作,收集服务器是否响应以及每个服务器的响应时间。计时器应该 运行 从用户键入“开始”到他们键入“停止”或“退出”为止。数据将被记录回另一个 CSV 文件,其中包含网址、响应时间以及服务器是否响应。

using System;
using System.Timers;
using System.IO;
using System.Linq;
using System.Net.NetworkInformation; 
using System.Collections.Generic;
using Microsoft.VisualBasic;

namespace MT_proj4
{

public class Program
{
    public static String[] addressArray = File.ReadAllLines("Project04_URLs.csv");

    public static string IP;
    public bool status;
    public string time;


    public static void Main() 
    {
        foreach (string s in addressArray) 
        {
            IP = Console.ReadLine();
            bool PingHost(string)
            {
                bool pingable = false;
                    #pragma warning disable XS0001 // Find APIs marked as TODO in Mono
                Ping pinger = new Ping();
                    #pragma warning restore XS0001 // Find APIs marked as TODO in Mono
                try
                {
                    PingReply reply = pinger.Send(IP);
                    pingable = reply.Status == IPStatus.Success;
                }
                catch (PingException)
                {
                    return false;
                }
                for (int i = 0; i < addressArray.Length; i++)
                {
                    addressArray[i] = addressArray[i] + pingable;
                }
            }

        }
    }

    static void TimerClass()
    {
        Timer timer = new Timer(5000);
        timer.Elapsed += HandleTimer;
        timer.Start();
        Console.WriteLine("Type 'exit' to close...");
        Console.WriteLine("Enter a command...");

        while (true)
        {
            Console.Write("Command: ");
            string command = Console.ReadLine();

            Console.WriteLine("Command entered: " + command);

            if (command.ToLower() == "stop")
                timer.Stop();

            else if (command.ToLower() == "exit")
                break; 
        }
    }

    static void HandleTimer(Object source, ElapsedEventArgs e)
    {
        Console.WriteLine("\nHandler not implemented...");
    }
}

我会稍微调整一下您的解决方案。 ping 代码应该 运行 它自己的线程。移除计时器,然后简单地阻塞 Console.ReadLine()。如果结果不是预期的,请重复直到停止或退出。

原因是 ping 工作和控制台处理在同一个线程上。这些会阻塞。

试试这个:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("pinging....until stop command");
        Thread pinger = new Thread(DoPinging);
        pinger.Start();

        while (true)
        {
            string command = Console.ReadLine();

            if (command.ToLower() == "stop")
                break;

            else if (command.ToLower() == "exit")
                break;

            Console.WriteLine("Ignoring-> " + command);
        }

        pinger.Abort();
    }

    static void DoPinging() 
    { 
        // here goes the pinging code
    }
}

在您的示例代码中,您似乎也想从控制台读取 ping 输入,在读取该行后,如果该值不等于停止命令(停止、退出),请将该值放入一个队列,让 ping 代码从队列中读取。

您提到读取 CSV 文件以获取要 ping 的地址(但您的示例代码未引用文件)。您可以将其作为命令行参数(在 main 中传递的字符串[])并在 DoPinging 方法中完成处理文件的工作。

如果您希望我添加更多详细信息,请在下方发表评论,我会处理的。

谢谢 马特