【问题标题】:Using ping in a foreach loop in C#在 C# 的 foreach 循环中使用 ping
【发布时间】:2018-08-22 04:47:46
【问题描述】:

我有一个涉及自动化的 C# 作业。我的代码主要基于我在网上找到的东西。我当前的问题是我试图从 CSV 文件中逐行读取 IP 地址到一个数组中,ping 数组的每个对象,并附加对象,以便每个对象将读取“IP,状态(如果 ping 成功),响应时间"

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

(如果它有助于解释任何事情,请在下面完整分配)

从预制的 C# 控制台应用程序开始,您的应用程序将在运行时允许三个命令 - 启动、停止和退出。应用程序将在首次运行时要求用户提供 CSV 文件(用户必须提供 CSV 文件)。该文件将包含网址(每行 1 个)——教授将提供初始文件。 您的应用程序将设置一个计时器,以便每次计时器运行时,它都会 ping 提供的网址,收集服务器是否响应以及每个服务器的响应时间。计时器应该从用户输入“start”到他们输入“stop”或“exit”时连续运行。数据将被记录回另一个 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()。如果结果不是预期的,请重复,直到您停止或退出
  • bool PingHost(string) Error CS1001: Identifier expected (CS1001) + PingHost 表示并非所有代码路径都返回值
  • @tatmanblue 我不确定你的意思? Console.ReadLine() 会去哪里?

标签: c# csv timer automation ping


【解决方案1】:

我会稍微调整一下您的解决方案。 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 中传递的 string[])并在 DoPinging 方法中处理文件。

如果您希望我对此添加更多详细信息,请在下方发表评论,我会继续努力。

谢谢 马特

【讨论】:

  • 好的,所以我只是将相同的 ping 代码从 IP = Console.ReadLine();正确的?它仍然给我预期的标识符错误,并且 PingLine 说并非所有代码路径都返回一个值,但其他一切都更有意义(谢谢)
  • (我修复了标识符问题)
  • awesome :) 随时在上面的问题中发布您的结果,以便其他人可以从中学习
猜你喜欢
  • 2020-02-06
  • 2015-07-04
  • 1970-01-01
  • 2016-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多